#include <bits/stdc++.h>   using namespace std;   const long long mod = 1e9 + 7;   long long power(long long a, long long b, long long m = mod) {     long long x = 1;     while (b) {       if (b & 1) {         x = 1ll * x * a % m;       }       a = 1ll * a * a % m;       b /= 2;     }     return x;   }   const int N = 5e5 + 9;   signed main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int tt;     cin >> tt;     while (tt--) {       int n;       cin >> n;       vector<vector<int>> g(n + 1);       map<pair<int, int>, vector<int>> gg;       vector<vector<int>> a(n + 1, vector<int>(3));       map<pair<int, int>, int> ed1;       for (int i = 1; i <= n - 2; i++) {         for (int j = 0; j < 3; j++) {           cin >> a[i][j];         }         for (int j = 0; j < 3; j++) {           int u = a[i][j];           int v = a[i][(j + 1) % 3];           if (u > v) swap(u, v);           g[u].push_back(v);           g[v].push_back(u);           gg[{u, v}].push_back(i);           ed1[{u, v}]++;         }       }       vector<vector<int>> gp(n + 1);       for (auto it : ed1) {         if (it.second == 1) {           int u = it.first.first, v = it.first.second;           gp[u].push_back(v);           gp[v].push_back(u);         }       }       vector<int> poly;       vector<int> vis(n + 1);       map<pair<int, int>, int> ed;       vis[1] = 1;       poly.push_back(1);       for (int i = 1;;) {         int pi = i;         for (int v : gp[i]) {           if (vis[v] == 0) {             vis[v] = 1;             i = v;             ed[{min(pi, i), max(pi, i)}]++;             break;           }         }         if (i == pi) {           ed[{1, pi}]++;           break;         }         poly.push_back(i);       }       vector<int> cnt(n + 2);       for (int i : poly) cout << i <<    ;       cout <<   n ;       if (n == 3) {         cout <<  1 n ;         continue;       }       function<pair<int, int>(int)> get_corner = [&](int i) {         int cc = 0, tu;         for (int j = 0; j < 3; j++) cnt[a[i][j]] = 0;         for (int j = 0; j < 3; j++) {           int u = a[i][j];           int v = a[i][(j + 1) % 3];           if (u > v) swap(u, v);           if (ed.count({u, v})) {             cc++;             cnt[u]++;             cnt[v]++;             if (cnt[u] > cnt[v])               tu = u;             else               tu = v;           }         }         return make_pair(tu, cc);       };       int cur = 1;       set<pair<int, int>> ss;       for (int i = 1; i <= n - 2; i++) {         auto r = get_corner(i);         if (r.second == 2) {           cur = i;           ss.insert({-r.second, i});         }       }       while ((int)ss.size() > 1) {         auto it = *ss.begin();         ss.erase(ss.begin());         cur = it.second;         auto r = get_corner(cur);         cout << cur <<    ;         int x = -1, y = -1;         for (int j = 0; j < 3; j++) {           int v = a[cur][j];           if (v != r.first) {             if (x == -1)               x = v;             else               y = v;           }         }         if (x > y) swap(x, y);         int ind = 0;         auto tmp = gg[{x, y}];         if (tmp.empty()) {           return 0;         }         if (tmp[ind] == cur) ind++;         ed[{x, y}]++;         cur = tmp[ind];         r = get_corner(cur);         ss.erase({-r.second + 1, cur});         ss.insert({-r.second, cur});       }       cout << ss.begin()->second <<   n ;     }     return 0;   }