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.
class Deque:
    def __init__(self):
        self.items = []
    
    def push_right(self, item): 
        self.items.append(item)
        
    def push_left(self, item): 
        self.items.insert(0, item)
    
    def pop_right(self): 
        return self.items.pop()
    
    def pop_left(self): 
        return self.items.pop(0)
    
    def top_right(self): 
        return self.items[len(self.items) - 1]
    
    def top_left(self): 
        return self.items[0]
    
    def empty(self): 
        return self.items == []
    
    def size(self): 
        return len(self.items)


n = int(input()) 
list_data = [] 
single_vertex = Deque() 
for i in range(n):
    degreev, sv = map(int, input().split())
    if (degreev == 1):
        single_vertex.push_right(i)
    list_data.append([degreev, sv])

count = 0
edges = ''
while not single_vertex.empty():
    vertex = single_vertex.pop_left()
    degreev, sv = list_data[vertex]
    if degreev == 0:
        continue 
    second_degreev, second_sv = list_data[sv]
    if second_degreev == 2:
        single_vertex.push_right(sv)
    list_data[sv] = [second_degreev-1, second_sv^vertex]
    edges += str(vertex)+' '+str(sv)+'\n'
    count += 1
print(count)
print(edges)