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.
import sys
import os.path
 
if(os.path.exists('input.txt')) :
    sys.stdin = open("input.txt", "r")
    sys.stdout = open("output.txt", "w")
    sys.stderr = open("error.txt", "w")
    
depth = 1000000
mod = 1000000007 
lim = mod * mod
sys.setrecursionlimit(depth) 
 
linp = lambda: list(minp())
minp = lambda: map(int, input().split())
 
from math import inf, ceil, sqrt, log2, gcd
from collections import defaultdict, deque
 
dd = lambda x: defaultdict(lambda: x)
dxy = [(1, 0),(-1, 0),(0, 1),(0, -1)]

n, a = int(input()), list()
for i in range(n) :
    x, y = minp()
    a.append([x, y, i])
q = list()
for e in a :
    if e[0] == 1 :
        q.append(e[2])
r = list()
while q :
    i = q.pop()
    if a[i][0] != 1 : continue
    u, v = a[i][1], a[i][2]
    a[i][0] = a[i][0] - 1
    a[i][1] = a[i][1] ^ u
    r.append((min(u, v), max(u, v)))
    a[u][0] = a[u][0] - 1
    a[u][1] = a[u][1] ^ v
    if a[u][0] == 1 :
        q.append(a[u][2])
r = list(set(r))
print(len(r))
for e in r : print(e[0], e[1])