#include <bits/stdc++.h>
using namespace std;
bitset<1010> s[1010], tmp, rlt, rlt1, S[1010];
int sz[1010];
bool vis[1010][1010];
pair<int, int> A[1010 * 1010];
vector<int> v[1010];
int a[1010], di[1010], pa[1010];
int Mx(bitset<1010> tmp) {
  int rlt = 0;
  for (int i = 9; i >= 0; i--) {
    if ((tmp >> (rlt + (1 << i))).count()) rlt += 1 << i;
  }
  return rlt;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &sz[i]);
    for (int j = 0; j < sz[i]; j++) {
      int x;
      scanf("%d", &x);
      s[i][x - 1] = 1;
    }
  }
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      tmp = s[i] & s[j];
      if (tmp.count() != 2) continue;
      int x = Mx(tmp);
      tmp[x] = 0;
      int y = Mx(tmp);
      vis[x][y] = vis[y][x] = 1;
    }
  int cnt = 0;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (vis[i][j]) {
        v[i].push_back(j);
        v[j].push_back(i);
        A[cnt++] = pair<int, int>(i, j);
      }
  if (!cnt) {
    for (int i = 2; i <= n; i++) printf("1 %d\n", i);
    return 0;
  }
  if (cnt == 1) {
    tmp = 0;
    int x = A[0].first;
    int y = A[0].second;
    bool bf = 0;
    for (int i = 0; i < n; i++) {
      if (sz[i] == n) continue;
      if (!bf) {
        bf = 1;
        for (int j = 0; j < n; j++)
          if (s[i][j] && j != x) {
            printf("%d %d\n", x + 1, j + 1);
          }
        tmp = s[i];
      } else if (tmp != s[i]) {
        for (int j = 0; j < n; j++)
          if (s[i][j] && j != x && j != y) {
            printf("%d %d\n", y + 1, j + 1);
          }
        return 0;
      }
    }
  }
  int st = 0;
  int en = 0;
  for (int i = 0; i < n; i++)
    if (v[i].size() >= 2) {
      a[en++] = i;
      di[i] = 0;
      pa[i] = -1;
      while (en - st > 0) {
        int x = a[st];
        if (di[x] == v[x].size())
          st++;
        else if (v[x][di[x]] == pa[x])
          di[x]++;
        else {
          int y = v[x][di[x]];
          pa[y] = x;
          di[y] = 0;
          di[x]++;
          a[en++] = y;
        }
      }
      break;
    }
  for (int i = 0; i < n; i++) rlt1[i] = 1;
  for (int i = 0; i < n; i++)
    if (v[i].size()) {
      S[i][i] = 1;
      for (int j = 0; j < v[i].size(); j++) S[i][v[i][j]] = 1;
      rlt[i] = 1;
      rlt1[i] = 0;
    }
  for (int i = en - 1; i >= 0; i--) {
    int k = a[i];
    for (int j = 0; j < n; j++) {
      tmp = s[j] & rlt;
      if (tmp != S[k]) continue;
      tmp = s[j] & rlt1;
      while (1) {
        int x = Mx(tmp);
        if (!v[x].size()) {
          v[k].push_back(x);
          v[x].push_back(k);
        }
        tmp[x] = 0;
        if (!tmp.count()) break;
      }
      break;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < v[i].size(); j++) {
      int k = v[i][j];
      if (k > i) printf("%d %d\n", i + 1, k + 1);
    }
  }
  return 0;
}
