Let's define a forest as a non-directed acyclic graph (also without loops and parallel edges). One day Misha played with the forest consisting of *n* vertices. For each vertex *v* from 0 to *n* - 1 he wrote down two integers, *degree*<sub class="lower-index">*v*</sub> and *s*<sub class="lower-index">*v*</sub>, were the first integer is the number of vertices adjacent to vertex *v*, and the second integer is the XOR sum of the numbers of vertices adjacent to *v* (if there were no adjacent vertices, he wrote down 0). 

Next day Misha couldn't remember what graph he initially had. Misha has values *degree*<sub class="lower-index">*v*</sub> and *s*<sub class="lower-index">*v*</sub> left, though. Help him find the number of edges and the edges of the initial graph. It is guaranteed that there exists a forest that corresponds to the numbers written by Misha.
The first line contains integer *n* (1 ≤ *n* ≤ 2<sup class="upper-index">16</sup>), the number of vertices in the graph.

The *i*-th of the next lines contains numbers *degree*<sub class="lower-index">*i*</sub> and *s*<sub class="lower-index">*i*</sub> (0 ≤ *degree*<sub class="lower-index">*i*</sub> ≤ *n* - 1, 0 ≤ *s*<sub class="lower-index">*i*</sub> &lt; 2<sup class="upper-index">16</sup>), separated by a space.
# compiler on CodeForces: PyPy 3 64bit
import sys
from collections import defaultdict
input = lambda: sys.stdin.readline()[:-1]
print = lambda *args: sys.stdout.write(' '.join(map(str, args)) + '\n')

graph = defaultdict(dict)
x = []
queue = []

n = int(input())
for i in range(n):
    degree, xor_sum = [int(e) for e in input().split()]
    x.append([degree, xor_sum])
    if degree == 1:
        queue.append([i, xor_sum])

answer = []
while queue:
    a, b = queue.pop()
    if x[a][0] == 0:
        continue
    answer.append((a, b))
    degree, xor_sum = x[b]
    x[a] = [0, 0]
    x[b] = [degree - 1, xor_sum ^ a]
    if x[b][0] == 1:
        queue.append([b, x[b][1]])
print(len(answer))
for e in answer:
    print(*e)
