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.
from collections import defaultdict
from typing import DefaultDict


inf = float("inf")
en = lambda x: list(enumerate(x))

ii = lambda: int(input())
r = lambda: map(int, input().split())
rr = lambda: list(r())

n = ii()
arr = [[*rr(), i] for i in range(n)]
arr.sort()

ans = []
tree = DefaultDict(list)
xtree = defaultdict(lambda: 0)
for i, j, k in arr:
    xtree[k] = j


for i, j, k in arr:
    xtree[k] ^= j
    xtree[xtree[k]] ^= k
    tree[xtree[k]] += (xtree[xtree[k]],)
    tree[k] += (xtree[k],)

ok = defaultdict(lambda: 1)
for i in tree.keys():
    for j in tree[i]:
        if ok[(i, j)] and ok[(j, i)] and i < n and j < n and i != j:
            ans += ([i, j],)
            ok[(i, j)] = 0

print(len(ans))
for i in ans:
    print(*i)
