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.
n = int(input())
deg2vs = {}
ss = [0] * n
degs = [0] * n
for i in range(n):
    degs[i], ss[i] = list(map(int, input().split()))
    if degs[i] > 0:
        if degs[i] not in deg2vs:
            deg2vs[degs[i]] = set()
        deg2vs[degs[i]].add(i)
edges = []
while len(deg2vs) != 0:
    leaves = deg2vs.pop(1)
    for leaf in leaves:
        if degs[leaf] == 0:
            continue
        v = ss[leaf]
        edges.append((leaf, v))
        v_deg = degs[v]
        if v_deg > 1:
            deg2vs[v_deg].remove(v)
            if len(deg2vs[v_deg]) == 0:
                deg2vs.pop(v_deg)

        ss[v] = ss[v] ^ leaf
        degs[v] -= 1
        if degs[v] > 0:
            if degs[v] not in deg2vs:
                deg2vs[degs[v]] = set()
            deg2vs[degs[v]].add(v)
print(len(edges))
for edge in edges:
    print(edge[0], edge[1])




