#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1024;
int size[MAXN], in[MAXN], deg[MAXN];
bitset<MAXN> a[MAXN], c;
vector<pair<int, int> > edges;
set<pair<int, int> > was;
int main() {
  int n;
  scanf("%d", &n);
  bool star = 1;
  for (int i = 0; (i) < (n); ++i) {
    scanf("%d", &size[i]);
    if (size[i] != n) star = 0;
    for (int j = 0; (j) < (size[i]); ++j) {
      int l;
      scanf("%d", &l);
      a[i][l - 1] = 1;
    }
  }
  if (star) {
    for (int i = 0; (i) < (n - 1); ++i) printf("%d %d\n", i + 1, n);
    return 0;
  }
  for (int i = 0; (i) < (n); ++i)
    for (int j = (i + 1); (j) < (n); ++j) {
      c = a[i] & a[j];
      unsigned int *cur = (unsigned int *)&c;
      vector<int> v;
      for (int g = 0; (g) < (MAXN / 32); ++g) {
        if (*cur != 0) {
          for (int k = (32) - 1; (k) >= 0; --k)
            if (((*cur) >> k) & 1) v.push_back(g * 32 + k);
          if ((int)((v).size()) > 2) break;
        }
        cur++;
      }
      if ((int)((v).size()) == 2) edges.push_back(make_pair(v[0], v[1]));
    }
  sort((edges).begin(), (edges).end());
  edges.resize(unique((edges).begin(), (edges).end()) - edges.begin());
  for (auto edge : edges) {
    in[edge.first] = in[edge.second] = 1;
    deg[edge.first]++, deg[edge.second]++;
    was.insert(make_pair(edge.first, edge.second));
    was.insert(make_pair(edge.second, edge.first));
  }
  for (int i = 0; (i) < (n); ++i)
    if (!in[i]) {
      int minn = 2 * n, ind = -1;
      for (int j = 0; (j) < (n); ++j)
        if (a[j][i] == 1 && size[j] < minn) {
          minn = min(minn, size[j]);
          ind = j;
        }
      assert(ind != -1);
      vector<int> vIn;
      for (int j = 0; (j) < (n); ++j)
        if (a[ind][j] && in[j]) vIn.push_back(j);
      if ((int)((vIn).size()) > 2) {
        for (int j = 0; (j) < ((int)((vIn).size())); ++j) {
          bool ok = 1;
          for (int g = 0; (g) < ((int)((vIn).size())); ++g) {
            if (g != j && !was.count(make_pair(vIn[j], vIn[g]))) {
              ok = 0;
              break;
            }
          }
          if (ok) {
            edges.push_back(make_pair(vIn[j], i));
            break;
          }
        }
      } else {
        assert((int)((vIn).size()) == 2);
        assert(deg[vIn[0]] == 1 || deg[vIn[1]] == 1);
        if (deg[vIn[0]] == 1 && deg[vIn[1]] == 1) {
          int ind2 = -1;
          for (int j = 0; (j) < (n); ++j)
            if (size[j] != n) {
              ind2 = j;
              break;
            }
          assert(ind != -1);
          if (a[ind2] == a[ind])
            edges.push_back(make_pair(vIn[0], i));
          else
            edges.push_back(make_pair(vIn[1], i));
        } else {
          for (int j = 0; (j) < (2); ++j)
            if (deg[vIn[j]] == 1) edges.push_back(make_pair(vIn[j], i));
        }
      }
    }
  for (auto edge : edges) printf("%d %d\n", edge.first + 1, edge.second + 1);
  return 0;
}
