#include <bits/stdc++.h>
struct Piece {
  int a, b, c;
  int id;
  Piece(int a = 0, int b = 0, int c = 0, int id = 0)
      : a(a), b(b), c(c), id(id) {}
};
struct Element {
  long long value;
  int id;
  bool operator<(const Element& other) const { return value < other.value; }
};
struct Link {
  int id;
  int next;
};
Piece p[100010];
Element e[300050];
std::vector<int> g[100010];
int queue[100010];
int vis[100005];
int parent[100010];
int pos[100010];
Link order[100010];
Piece stdPiece(Piece u) {
  int cur[3];
  cur[0] = u.a, cur[1] = u.b, cur[2] = u.c;
  std::sort(cur, cur + 3);
  return Piece(cur[0], cur[1], cur[2], 0);
}
long long getValue(long long a, long long b, long long n) { return a * n + b; }
int isEqual(int a, int b, int c, int d) { return ((a == c) && (b == d)); }
Piece getLine(Piece u, Piece v) {
  if (isEqual(u.b, u.c, v.b, v.c)) {
    return Piece(u.a, u.b, u.c);
  } else if (isEqual(u.b, u.c, v.a, v.c)) {
    return Piece(u.a, u.b, u.c);
  } else if (isEqual(u.b, u.c, v.a, v.b)) {
    return Piece(u.a, u.b, u.c);
  } else if (isEqual(u.a, u.c, v.b, v.c)) {
    return Piece(u.b, u.a, u.c);
  } else if (isEqual(u.a, u.c, v.a, v.c)) {
    return Piece(u.b, u.a, u.c);
  } else if (isEqual(u.a, u.c, v.a, v.b)) {
    return Piece(u.b, u.a, u.c);
  } else if (isEqual(u.a, u.b, v.b, v.c)) {
    return Piece(u.c, u.a, u.b);
  } else if (isEqual(u.a, u.b, v.a, v.c)) {
    return Piece(u.c, u.a, u.b);
  } else {
    return Piece(u.c, u.a, u.b);
  }
}
void Insert(int m, int l, int r) {
  if (order[l].next == r) {
    order[l].next = m;
    order[m].next = r;
  } else {
    order[r].next = m;
    order[m].next = l;
  }
}
void bfs(int s, int n) {
  for (int i = 1; i <= n; i++) vis[i] = 0;
  int h = 0, t = -1;
  queue[++t] = s;
  parent[s] = -1;
  vis[s] = 1;
  while (h <= t) {
    int u = queue[h++];
    for (unsigned int i = 0; i < g[u].size(); i++) {
      int v = g[u][i];
      if (vis[v]) continue;
      parent[v] = u;
      vis[v] = 1;
      queue[++t] = v;
    }
  }
}
int main() {
  int kase;
  scanf("%d", &kase);
  while (kase--) {
    int n;
    scanf("%d", &n);
    for (int i = 0; i <= n; i++) g[i].clear();
    int size = 0;
    for (int i = 1; i <= n - 2; i++) {
      scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].c);
      p[i] = stdPiece(p[i]);
      p[i].id = i;
      e[size].id = e[size + 1].id = e[size + 2].id = p[i].id;
      e[size].value = getValue(p[i].a, p[i].b, n);
      e[size + 1].value = getValue(p[i].a, p[i].c, n);
      e[size + 2].value = getValue(p[i].b, p[i].c, n);
      size += 3;
    }
    std::sort(e, e + size);
    for (int i = 0; i < size - 1; i++) {
      if (e[i].value == e[i + 1].value) {
        int u = e[i].id, v = e[i + 1].id;
        g[u].push_back(v);
        g[v].push_back(u);
      }
    }
    bfs(1, n - 2);
    int cnt = 0;
    for (int i = 0; i <= n - 2 - 1; i++) {
      int u = queue[i];
      if (parent[u] != -1) {
        Piece border = getLine(p[u], p[parent[u]]);
        pos[border.a] = cnt;
        order[cnt].id = border.a;
        Insert(cnt, pos[border.b], pos[border.c]);
        cnt++;
      } else {
        Piece cur = p[u];
        pos[cur.a] = cnt;
        pos[cur.b] = cnt + 1;
        pos[cur.c] = cnt + 2;
        order[cnt].id = cur.a;
        order[cnt + 1].id = cur.b;
        order[cnt + 2].id = cur.c;
        order[cnt].next = cnt + 1;
        order[cnt + 1].next = cnt + 2;
        order[cnt + 2].next = cnt;
        cnt += 3;
      }
    }
    int start = 1;
    int current = start;
    do {
      printf("%d ", order[current].id);
      current = order[current].next;
    } while (current != start);
    printf("\n");
    for (int i = n - 2 - 1; i >= 0; i--) printf("%d ", queue[i]);
    printf("\n");
  }
  return 0;
}
