#include <bits/stdc++.h>
using namespace std;
const int MODULO = 1e9 + 7;
const char SPACE = ' ', ENDL = '\n';
int ri() {
  int v;
  cin >> v;
  return v;
}
long long rll() {
  long long v;
  cin >> v;
  return v;
}
vector<int> rvi(int n) {
  vector<int> a(n);
  for (int i = 0; i < n; ++i) cin >> a[i];
  return a;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int tests = ri();
  bool fourth = false;
  for (int t = 0; t < tests; ++t) {
    int n = ri();
    vector<vector<int> > a(n - 1, vector<int>());
    for (int i = 0; i < n - 1; ++i) {
      int sz = ri();
      a[i] = rvi(sz);
    }
    vector<vector<int> > in(n - 1, vector<int>(n + 1, false));
    for (int i = 0; i < a.size(); ++i) {
      for (int v : a[i]) in[i][v] = true;
    }
    vector<int> cnts(n + 1, 0);
    for (auto& row : a) {
      for (int v : row) {
        cnts[v]++;
      }
    }
    vector<int> pl;
    for (int i = 1; i <= n; ++i) {
      if (cnts[i] == 1) {
        pl.push_back(i);
      }
    }
    vector<int> ans(n, 0);
    for (int last : pl) {
      cnts.assign(n + 1, 0);
      for (auto& row : a) {
        for (int v : row) {
          cnts[v]++;
        }
      }
      vector<int> used(n - 1, false);
      ans.assign(n, -1);
      ans[n - 1] = last;
      bool fail = false;
      for (int j = n - 1; j >= 2; --j) {
        if (j != n - 1) {
          int f1 = -1, f2 = -1;
          for (int v = 1; v <= n; ++v) {
            if (cnts[v] == 1) {
              bool is_first = find(pl.begin(), pl.end(), v) != pl.end();
              if (!is_first) {
                if (f1 == -1)
                  f1 = v;
                else
                  f2 = v;
              }
            }
          }
          if (f2 != -1) {
            int c1 = 0, c2 = 0;
            for (int i = 0; i < a.size(); ++i) {
              if (used[i]) {
                if (in[i][f1]) ++c1;
                if (in[i][f2]) ++c2;
              }
            }
            if (c1 < c2) {
              swap(f1, f2);
            }
          }
          ans[j] = f1;
        }
        if (ans[j] == -1) {
          fail = true;
          break;
        }
        for (int i = 0; i < n - 1; ++i) {
          if (!used[i] && in[i][ans[j]]) {
            for (int v : a[i]) {
              cnts[v]--;
            }
            used[i] = true;
          }
        }
      }
      if (fail) continue;
      int j = 0;
      int f1 = -1, f2 = -1;
      for (int v = 1; v <= n; ++v) {
        if (cnts[v] == 1) {
          if (f1 == -1)
            f1 = v;
          else
            f2 = v;
        }
      }
      for (int i = 0; i < a.size(); ++i) {
        if (in[i][f1] && !in[i][f2]) {
          swap(f1, f2);
          break;
        }
      }
      ans[0] = f1;
      ans[1] = f2;
      break;
    }
    for (int v : ans) {
      cout << v << SPACE;
    }
    cout << ENDL;
  }
  return 0;
}
