#include <bits/stdc++.h>
const int maxn = 1e2 + 10;
using namespace std;
struct node {
  int l, r;
  node() {
    l = 0;
    r = 0;
  }
} a[maxn];
int idx[maxn];
int Find(int n) {
  if (a[n].r) {
    return Find(a[n].r);
  } else
    return n;
}
int main() {
  int n;
  while (~scanf("%d", &n)) {
    int l, r;
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
      scanf("%d%d", &l, &r);
      a[i].l = l;
      a[i].r = r;
      if (l == 0) {
        idx[cnt++] = i;
      }
    }
    for (int i = 0; i < cnt - 1; i++) {
      int st = idx[i];
      int it = Find(st);
      a[it].r = idx[i + 1];
      a[idx[i + 1]].l = it;
    }
    for (int i = 1; i <= n; i++) {
      printf("%d %d\n", a[i].l, a[i].r);
    }
  }
  return 0;
}
