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 deque


class CodeforcesTask504ASolution:
    def __init__(self):
        self.result = ''
        self.n = 0
        self.vertices = []

    def read_input(self):
        self.n = int(input())
        for x in range(self.n):
            self.vertices.append([int(y) for y in input().split(" ")])

    def process_task(self):
        used = 0
        proc = deque()
        for x in range(self.n):
            if self.vertices[x][0] == 1:
                proc.append(x)
            elif self.vertices[x][0] == 0:
                if self.vertices[x][1] != 0:
                    raise ValueError
                used += 1
        edges = []
        while proc:
            from_ = proc.popleft()
            used += 1
            if self.vertices[from_][0] == 0:
                if self.vertices[from_][1] != 0:
                    raise ValueError
                continue
            self.vertices[from_][0] -= 1
            to_ = self.vertices[from_][1]
            self.vertices[from_][1] = 0
            if to_ >= self.n:
                raise ValueError
            edges.append((from_, to_))
            self.vertices[to_][1] ^= from_
            if self.vertices[to_][0] == 0:
                raise ValueError
            self.vertices[to_][0] -= 1
            if self.vertices[to_][0] == 1:
                proc.append(to_)
        if used != self.n:
            raise ValueError
        self.result = "{0}\n{1}".format(len(edges), "\n".join([" ".join([str(x) for x in edge]) for edge in edges]))

    def get_result(self):
        return self.result


if __name__ == "__main__":
    Solution = CodeforcesTask504ASolution()
    Solution.read_input()
    Solution.process_task()
    print(Solution.get_result())
