#include <bits/stdc++.h>
using namespace std;
const int MAX = 200 + 5;
vector<vector<int>> ps;
int ppos[MAX];
int n;
vector<int> roll(int f, int s) {
  memset(ppos, -1, sizeof ppos);
  ppos[f] = 0;
  ppos[s] = 1;
  vector<int> result{f, s};
  for (int i = int(0); i < int(n - 2); i++) {
    bool found = false;
    for (auto &p : ps) {
      int size = p.size();
      if (size > result.size() + 1) continue;
      int not_in_cnt = 0;
      int x = 0;
      int cur_pos = result.size();
      bool invalid = false;
      for (auto &e : p) {
        if (ppos[e] == -1) {
          not_in_cnt++;
          x = e;
        } else if (ppos[e] < cur_pos - (size - 1)) {
          invalid = true;
          break;
        }
      }
      if (!invalid && not_in_cnt == 1) {
        ppos[x] = result.size();
        result.push_back(x);
        found = true;
        break;
      }
    }
    if (!found) return vector<int>();
  }
  return result;
}
void solve() {
  ps.clear();
  cin >> n;
  for (int i = int(0); i < int(n - 1); i++) {
    int sz;
    cin >> sz;
    vector<int> p;
    for (int j = int(0); j < int(sz); j++) {
      int k;
      cin >> k;
      p.push_back(k);
    }
    ps.push_back(p);
  }
  vector<int> result;
  for (auto &p : ps) {
    if (p.size() == 2) {
      vector<int> a = roll(p[0], p[1]);
      if (!a.empty()) {
        result = a;
        break;
      }
      vector<int> b = roll(p[1], p[0]);
      if (!b.empty()) {
        result = b;
        break;
      }
    }
  }
  for (auto &each : result) cout << each << " ";
  cout << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int tests;
  cin >> tests;
  for (int i = 1; i <= tests; i++) {
    solve();
  }
  return 0;
}
