#include <bits/stdc++.h>
using namespace std;
const int M = 5e6 + 5;
const long long int mod = 1e9 + 7;
const long long int inf = 9e18;
const double pi = 3.14159265358979323846;
long long int t = 0, n, m, x, sum, k, p, u = 0, t1 = 1;
string s, z, ans = "";
long long int P[10000005] = {0};
void sieve() {
  for (long long int i = 2; i < (10000005); i++)
    if (!P[i])
      for (long long int j = i * i; j < (10000005); j += i) P[j] = i;
}
long long int raised(long long int x, long long int v) {
  if (v == 0) return 1 % mod;
  if (v % 2 == 1) return (x * raised(x, v - 1)) % mod;
  long long int r = raised(x, v / 2);
  return (r * r) % mod;
}
bool prime(long long int n) {
  if (n == 1) return 1;
  for (int i = 2; i <= sqrt(n); i++)
    if (n % i == 0) return 0;
  return 1;
}
long long int hcf(long long int a, long long int b) {
  if (a % b == 0) return b;
  return hcf(b, a % b);
}
bool comp(long long int a, long long int b) { return a < b; }
long long int g = 0;
long long int dfs(vector<long long int> a[], long long int x, long long int f[],
                  long long int k, long long int b[]) {
  if (f[x]) return 0;
  f[x] = 1;
  long long int c = 0, j = 0;
  if (b[x])
    k--;
  else
    k = m;
  if (k < 0) return 0;
  for (long long int i = 0; i < (long long int)((a[x]).size()); i++) {
    if (!f[a[x][i]]) {
      c += dfs(a, a[x][i], f, k, b);
      j++;
    }
  }
  if (j == 0) c = 1;
  return c;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  t1 = 1;
  while (t1--) {
    cin >> n;
    long long int a[n], b[n], x, y;
    vector<long long int> v;
    vector<pair<long long int, long long int> > p;
    for (long long int i = 0; i < n; i++) {
      cin >> a[i] >> b[i];
      if (a[i] == 1) v.push_back(i);
    }
    while ((long long int)((v).size())) {
      x = v.back();
      v.pop_back();
      if (a[x] <= 0) continue;
      p.push_back(make_pair(x, b[x]));
      y = b[x];
      a[y]--;
      b[y] ^= x;
      if (a[y] == 1) v.push_back(y);
    }
    cout << (long long int)((p).size()) << "\n";
    for (long long int i = 0; i < (long long int)((p).size()); i++)
      cout << p[i].first << " " << p[i].second << "\n";
  }
}
