#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; if (!(cin >> T)) return 0; while (T--) { int n; cin >> n; if (n <= 0) { cout << "\n"; continue; } vector> D(n, vector(n, 0)); // Read upper triangle distances in lex order: (1,2),(1,3),...,(1,n),(2,3),... for (int i = 0; i < n; ++i) { D[i][i] = 0; } for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { int x; cin >> x; D[i][j] = D[j][i] = x; } } if (n == 1) { // No edges cout << "\n"; continue; } const int INF = 1000000007; vector key(n, INF); vector parent(n, -1); vector used(n, 0); key[0] = 0; for (int it = 0; it < n; ++it) { int u = -1; int best = INF; for (int i = 0; i < n; ++i) { if (!used[i] && key[i] < best) { best = key[i]; u = i; } } if (u == -1) break; used[u] = 1; for (int v = 0; v < n; ++v) { if (!used[v] && D[u][v] < key[v]) { key[v] = D[u][v]; parent[v] = u; } } } // Output n-1 edges as "u v w" (1-based indices) for (int v = 1; v < n; ++v) { int u = parent[v]; int w = D[u][v]; cout << (u + 1) << ' ' << (v + 1) << ' ' << w << '\n'; } } return 0; }