#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
using namespace std;
int T, N;
set<int> st[205];
vector<int> adj[205];
int ans[205], order[205];
void init() {
  for (int i = 1; i <= 200; i++) st[i].clear();
  memset(ans, 0, sizeof ans);
  for (int i = 1; i <= 200; i++) adj[i].clear();
}
bool dfs2(int u, int pos, set<int> st[]) {
  if (pos == N + 1) return true;
  if (u == -1 && pos <= N) return false;
  ans[pos] = u;
  int nx_u = -1;
  for (int i = 1; i <= N - 1; i++) {
    st[i].erase(u);
    if (st[i].size() == 1) nx_u = *(st[i].begin());
  }
  return dfs2(nx_u, pos + 1, st);
}
bool cmp(int &a, int &b) { return order[a] < order[b]; }
bool judge() {
  for (int i = 1; i <= N; i++) order[ans[i]] = i;
  for (int i = 1; i <= N - 1; i++) {
    sort(adj[i].begin(), adj[i].end(), cmp);
    for (int j = 1; j < adj[i].size(); j++) {
      int &l = adj[i][j - 1], &r = adj[i][j];
      if (order[r] - order[l] != 1) return false;
    }
  }
  return true;
}
void solve() {
  for (int i = 1; i <= N; i++) {
    set<int> tmp[205];
    for (int j = 1; j <= 200; j++) {
      for (auto v : st[j]) {
        tmp[j].insert(v);
      }
    }
    if (dfs2(i, 1, tmp) && judge()) break;
  }
  for (int i = 1; i <= N; i++) cout << ans[i] << " ";
  cout << '\n';
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> T;
  while (T--) {
    init();
    cin >> N;
    for (int i = 1; i <= N - 1; i++) {
      int k;
      cin >> k;
      while (k--) {
        int cur;
        cin >> cur;
        st[i].insert(cur);
        adj[i].push_back(cur);
      }
    }
    solve();
  }
  return 0;
}
