#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
const long long INF = 0x3f3f3f3f3f3f3f3f;
const long long llinf = (1LL << 62);
const int inf = (1 << 30);
const int nmax = 2e2 + 50;
const long long mod = 1e9 + 7;
using namespace std;
int ts, n, i, j, t, u, nr[nmax], v[nmax], viz[nmax], k, x, p[nmax], one, two,
    tot[nmax], pos[nmax], bl, tt, br, i1, v1[nmax], viz1[nmax], nr1[nmax];
vector<int> vc[nmax], rv[nmax], vec, st;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cerr.tie(0);
  cout.tie(0);
  cin >> ts;
  while (ts--) {
    for (i = 1; i <= 200; i++) {
      nr[i] = v[i] = viz[i] = tot[i] = 0;
      vc[i].clear(), rv[i].clear();
    }
    cin >> n;
    for (i = 1; i < n; i++) {
      cin >> k;
      while (k--) {
        cin >> x;
        vc[i].push_back(x);
        nr[x]++;
        tot[x]++;
        rv[x].push_back(i);
      }
    }
    for (i = n; i >= 1; i--) {
      st.clear();
      for (j = 1; j <= n; j++)
        if (nr[j] == 1 && !viz[j]) st.push_back(j);
      if ((int)st.size() == 2) break;
      for (j = n; j >= 1; j--) {
        if (viz[j]) continue;
        if (nr[j] == 1) {
          viz[j] = 1;
          p[i] = j;
          pos[j] = i;
          for (t = 0; t < (int)rv[j].size(); t++) {
            if (v[rv[j][t]]) continue;
            for (u = 0; u < (int)vc[rv[j][t]].size(); u++) {
              nr[vc[rv[j][t]][u]]--;
            }
            v[rv[j][t]] = 1;
          }
          break;
        }
      }
    }
    i1 = i;
    for (i = 1; i <= n; i++) {
      v1[i] = v[i];
      viz1[i] = viz[i];
      nr1[i] = nr[i];
    }
    for (tt = (int)st.size() - 1; tt >= 0; tt--) {
      for (i = 1; i <= n; i++) {
        v[i] = v1[i];
        viz[i] = viz1[i];
        nr[i] = nr1[i];
      }
      p[1] = st[tt ^ 1], pos[p[1]] = 1;
      viz[p[1]] = 1;
      for (i = i1; i >= 2; i--) {
        if (i == i1)
          j = st[tt];
        else
          j = n;
        for (; j >= 1; j--) {
          if (viz[j]) continue;
          if (nr[j] == 1) {
            viz[j] = 1;
            p[i] = j;
            pos[j] = i;
            for (t = 0; t < (int)rv[j].size(); t++) {
              if (v[rv[j][t]]) continue;
              for (u = 0; u < (int)vc[rv[j][t]].size(); u++) {
                nr[vc[rv[j][t]][u]]--;
              }
              v[rv[j][t]] = 1;
            }
            break;
          }
        }
        if (j == 0) break;
      }
      if (i > 1) continue;
      bl = 0;
      for (i = 1; i < n; i++) {
        vec.clear();
        for (j = 0; j < (int)vc[i].size(); j++) {
          vec.push_back(pos[vc[i][j]]);
        }
        sort(vec.begin(), vec.end());
        for (j = 1; j < (int)vec.size(); j++)
          if (vec[j] != vec[j - 1] + 1) break;
        if (j != (int)vec.size()) {
          bl = 1;
          break;
        }
      }
      for (i = 1; i <= n; i++)
        if (!viz[i]) bl = 1;
      if (!bl) break;
    }
    for (i = 1; i <= n; i++) cout << p[i] << " ";
    cout << '\n';
  }
  return 0;
}
