#include <bits/stdc++.h>
using namespace std;
int n;
vector<set<int> > v[1002];
vector<set<int> > v2[1002];
bool used[1002];
int sel[1002][1002];
vector<pair<int, int> > outt;
queue<int> q;
int zz[1002];
void del(int node) {
  for (int i = 0; i < n; i++) {
    if (used[i]) continue;
    int id = sel[i][node];
    v[i][id].erase(node);
    if (v[i][id].size() == 0) {
      zz[i]--;
      outt.push_back(make_pair(node, i));
    }
    if (zz[i] == 1) {
      q.push(i);
    }
  }
}
struct UF {
  vector<int> belong;
  vector<int> size;
  void resize(int n) {
    belong.assign(n + 1, -1);
    size.assign(n + 1, 1);
  }
  inline int root(int b) {
    if (belong[b] == -1) {
      return b;
    }
    belong[b] = root(belong[b]);
    return belong[b];
  }
  void merge(int a, int b) {
    a = root(a);
    b = root(b);
    if (a == b) return;
    belong[a] = b;
    size[b] += size[a];
  }
};
UF uf;
vector<int> t[1002];
set<int> ss;
inline void gt(int b, int pr) {
  ss.insert(b);
  for (int i = 0; i < t[b].size(); i++) {
    if (t[b][i] == pr) continue;
    gt(t[b][i], b);
  }
}
vector<set<int> > v3[1002];
int main() {
  cin >> n;
  uf.resize(n);
  for (int i = 0; i < n; i++) {
    int num = n - 1;
    while (num) {
      int sz;
      scanf("%d", &sz);
      getchar();
      set<int> vv;
      for (int j = 0; j < sz; j++) {
        int a;
        scanf("%d", &a);
        a--;
        getchar();
        vv.insert(a);
        sel[i][a] = v[i].size();
      }
      v[i].push_back(vv);
      v2[i].push_back(vv);
      num -= sz;
      zz[i]++;
    }
    sort(v2[i].begin(), v2[i].end());
  }
  for (int i = 0; i < n; i++) {
    if (v[i].size() == 1) {
      used[i] = true;
      del(i);
    }
  }
  while (!q.empty()) {
    int b = q.front();
    q.pop();
    if (used[b]) continue;
    used[b] = true;
    del(b);
  }
  if (outt.size() != n - 1) {
    puts("-1");
    return 0;
  }
  for (int i = 0; i < outt.size(); i++) {
    if (uf.root(outt[i].first) == uf.root(outt[i].second)) {
      puts("-1");
      return 0;
    }
  }
  for (int i = 0; i < outt.size(); i++) {
    t[outt[i].first].push_back(outt[i].second);
    t[outt[i].second].push_back(outt[i].first);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < t[i].size(); j++) {
      ss.clear();
      gt(t[i][j], i);
      v3[i].push_back(ss);
    }
    sort(v3[i].begin(), v3[i].end());
    if (v3[i] != v2[i]) {
      puts("-1");
      return 0;
    }
  }
  cout << outt.size() << endl;
  for (int i = 0; i < outt.size(); i++) {
    printf("%d %d\n", outt[i].first + 1, outt[i].second + 1);
  }
  return 0;
}
