#include <bits/stdc++.h>
using namespace std;
const long long int INF = 9223372036854775807;
const long long int mod = 998244353;
int MOD(int a, int b) {
  if (a > b)
    return a - b;
  else
    return b - a;
}
long long int max3(long long int a, long long int b, long long int c) {
  return max(c, max(a, b));
}
long long int min3(long long int a, long long int b, long long int c) {
  return min(a, min(b, c));
}
long long int power(long long int x, long long int y, long long int mod1) {
  long long int res = 1;
  while (y > 0) {
    if (y & 1) res = (res * x) % mod1;
    y = y >> 1;
    x = (x * x) % mod1;
  }
  return res;
}
long long int logg(long long int a) {
  long long int x = 0;
  while (a > 1) {
    x++;
    a /= 2;
  }
  return x;
}
long long int gcd(long long int a, long long int b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
long long int abso(long long int x) {
  if (x < 0) {
    return -x;
  }
  return x;
}
long long int ceiling(long long int a, long long int b) {
  if (a % b == 0) {
    return a / b;
  } else {
    return a / b + 1;
  }
}
long long int modinv(long long int x, long long int p) {
  return power(x, p - 2, p);
}
struct point {
  long long int x;
  long long int y;
};
long long int cross(point a, point b) { return a.x * b.y - b.x * a.y; }
bool ccw(point p1, point p2) {
  if (cross(p1, p2) > 0) {
    return true;
  } else {
    return false;
  }
}
void ccw_sort(vector<point> &v) {
  vector<point> v1, v2;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].y > 0) {
      v1.push_back(v[i]);
    } else {
      v2.push_back(v[i]);
    }
  }
  sort(v1.begin(), v1.end(), ccw);
  sort(v2.begin(), v2.end(), ccw);
  for (int i = 0; i < v2.size(); i++) {
    v1.push_back(v2[i]);
  }
  v = v1;
}
vector<int> *dfs(int i, vector<int> &vis, vector<vector<int>> &v,
                 vector<vector<int>> &tree, vector<int> &parent) {
  vector<int> *ans;
  ans = new vector<int>;
  int par = -1;
  vis[i] = 1;
  for (int j = 0; j < tree[i].size(); j++) {
    if (!vis[tree[i][j]]) {
      auto v2 = dfs(tree[i][j], vis, v, tree, parent);
      if ((*v2).size() < (*ans).size()) {
        for (int j = 0; j < (*v2).size(); j++) {
          (*ans).push_back((*v2)[j]);
        }
      } else {
        for (int j = 0; j < (*ans).size(); j++) {
          (*v2).push_back((*ans)[j]);
        }
        ans = v2;
      }
    } else {
      par = tree[i][j];
    }
  }
  int next = v[i][0];
  if (par != -1) {
    for (int j = 0; j < 3; j++) {
      bool c = true;
      for (int k = 0; k < 3; k++) {
        if (v[i][j] == v[par][k]) {
          c = false;
          break;
        }
      }
      if (c) {
        next = v[i][j];
        break;
      }
    }
  }
  (*ans).push_back(i);
  parent[i] = par;
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    vector<vector<int>> v(n - 2);
    vector<vector<int>> tree(n);
    vector<int> parent(n);
    map<pair<int, int>, vector<int>> g;
    map<pair<int, int>, int> cnt;
    for (int i = 0; i < n - 2; i++) {
      v[i].resize(3);
      for (int j = 0; j < 3; j++) {
        cin >> v[i][j];
      }
      sort(v[i].begin(), v[i].end());
      g[make_pair(v[i][0], v[i][1])].push_back(i);
      cnt[make_pair(v[i][0], v[i][1])]++;
      g[make_pair(v[i][0], v[i][2])].push_back(i);
      cnt[make_pair(v[i][0], v[i][2])]++;
      g[make_pair(v[i][1], v[i][2])].push_back(i);
      cnt[make_pair(v[i][1], v[i][2])]++;
    }
    tree.resize(n);
    for (auto it = g.begin(); it != g.end(); it++) {
      for (int i = 0; i < (*it).second.size(); i++) {
        for (int j = i + 1; j < (*it).second.size(); j++) {
          tree[(*it).second[i]].push_back((*it).second[j]);
          tree[(*it).second[j]].push_back((*it).second[i]);
        }
      }
    }
    vector<int> vis(n + 1, 0);
    auto q = *(dfs(0, vis, v, tree, parent));
    vector<int> p;
    vector<vector<int>> adj(n + 1);
    for (auto it = cnt.begin(); it != cnt.end(); it++) {
      if ((*it).second == 1) {
        auto cur = (*it).first;
        int u = cur.first;
        int v = cur.second;
        adj[u].push_back(v);
        adj[v].push_back(u);
      }
    }
    for (int i = 0; i <= n; i++) {
      vis[i] = 0;
    }
    int cur = 1;
    vis[cur] = 1;
    p.push_back(cur);
    while (p.size() < n) {
      for (int j = 0; j < adj[cur].size(); j++) {
        if (!vis[adj[cur][j]]) {
          p.push_back(adj[cur][j]);
          cur = adj[cur][j];
          vis[cur] = 1;
          break;
        }
      }
    }
    for (int i = 0; i < p.size(); i++) {
      cout << p[i] << ' ';
    }
    cout << endl;
    for (int i = 0; i < q.size(); i++) {
      cout << q[i] + 1 << ' ';
    }
    cout << endl;
  }
}
