#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cctype>
#define M 505
#define IM 505*505/2
using namespace std;
int r[IM];
int w[IM];
int u[IM];
int v[IM];
int p[M];
int cnt;
int n; //ding dian shu
int cmp(const void *a,const void *b)
{
return w[*(int *)a] - w[*(int *)b];
}
void input_deal()
{
int temp;
cin>>n;
cnt = 0;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++){
cin>>temp;
if(j > i){
w[cnt] = temp;
u[cnt] = i;
v[cnt] = j;
cnt++;
}
}
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
int Kruskal()
{
int imax = 0;
for(int i = 0;i <= n;i++) p[i] = i; //初始化并查集
for(int i = 0;i < cnt;i++) r[i] = i; //初始化边序号
qsort(r,cnt,sizeof(r[0]),cmp); //按权值给边排序
for(int i = 0;i < cnt;i++){
int e,x,y;
e = r[i];
x = find(u[e]);
y = find(v[e]);
if(x != y){
if(w[e] > imax) imax = w[e];
p[x] = y;
}
}
return imax;
}
int main()
{
//freopen("in.in","r",stdin);
int cas;
cin>>cas;
while(cas--)
{
input_deal();
int imax = Kruskal();
cout<<imax<<endl;
}
return 0;
}
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cctype>
#define M 505
#define IM 505*505/2
using namespace std;
int r[IM];
int w[IM];
int u[IM];
int v[IM];
int p[M];
int cnt;
int n; //ding dian shu
int cmp(const void *a,const void *b)
{
return w[*(int *)a] - w[*(int *)b];
}
void input_deal()
{
int temp;
cin>>n;
cnt = 0;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++){
cin>>temp;
if(j > i){
w[cnt] = temp;
u[cnt] = i;
v[cnt] = j;
cnt++;
}
}
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
int Kruskal()
{
int imax = 0;
for(int i = 0;i <= n;i++) p[i] = i; //初始化并查集
for(int i = 0;i < cnt;i++) r[i] = i; //初始化边序号
qsort(r,cnt,sizeof(r[0]),cmp); //按权值给边排序
for(int i = 0;i < cnt;i++){
int e,x,y;
e = r[i];
x = find(u[e]);
y = find(v[e]);
if(x != y){
if(w[e] > imax) imax = w[e];
p[x] = y;
}
}
return imax;
}
int main()
{
//freopen("in.in","r",stdin);
int cas;
cin>>cas;
while(cas--)
{
input_deal();
int imax = Kruskal();
cout<<imax<<endl;
}
return 0;
}