#include <bits/stdc++.h>
using namespace std;
vector<int> padre, si;
int getPadre(int x) {
  int pa = padre[x];
  if (padre[x] != x) {
    pa = getPadre(padre[x]);
  }
  padre[x] = pa;
  return pa;
}
void merge(int x, int y) {
  int px = getPadre(x);
  int py = getPadre(y);
  if (si[px] < si[py]) {
    padre[px] = py;
  } else {
    padre[py] = px;
    if (si[px] == si[py]) si[py]++;
  }
}
bool conn(int x, int y) { return getPadre(x) == getPadre(y); }
int main() {
  int n;
  cin >> n;
  vector<int> voy(n + 1), viene(n + 1);
  for (int i = 0; i < (int)(n + 1); i++) {
    padre.push_back(i);
    si.push_back(1);
  }
  vector<int> sinviene, sinvoy;
  for (int i = 0; i < (int)(n); i++) {
    int l, r;
    cin >> l >> r;
    voy[i + 1] = r;
    viene[i + 1] = l;
    if (!r)
      sinvoy.push_back(i + 1);
    else
      merge(i + 1, r);
    if (!l)
      sinviene.push_back(i + 1);
    else
      merge(i + 1, l);
  }
  int iviene = 0;
  while (iviene < (int)sinviene.size()) {
    int svoy = sinvoy[iviene];
    for (int i = 0; i < (int)(n + 1); i++) {
      if (i == 0) continue;
      if (viene[i] != 0) continue;
      if (!conn(i, svoy)) {
        viene[i] = svoy;
        voy[svoy] = i;
        merge(svoy, i);
        break;
      }
    }
    iviene++;
  }
  for (int i = 0; i < (int)(n); i++) {
    cout << viene[i + 1] << " " << voy[i + 1] << endl;
  }
}
