/*
分析:
最小生成树,最大边。
2012-07-30 11:32
*/
分析:
最小生成树,最大边。
2012-07-30 11:32
*/
#include"stdio.h"
#include"stdlib.h"
int n;
struct A
{
int a,b;
int len;
int flag;
}E[250000];
int K;
int map[511][511];
int set[511];
int cmp(const void *a,const void *b)
{
struct A *c,*d;
c=(struct A *)a;
d=(struct A *)b;
return c->len-d->len;
}
void build(int num)
{
int i;
for(i=0;i<num;i++) set[i]=i;
}
int find(int k)
{
if(set[k]==k) return k;
set[k]=find(set[k]);
return set[k];
}
void Union(int f1,int f2)
{
set[f1]=f2;
}
int MAX(int a,int b)
{
return a>b?a:b;
}
int Krustal()
{
int i;
int ans;
int f1,f2;
for(i=0;i<K;i++) E[i].flag=0;
for(i=0;i<K;i++)
{
f1=find(E[i].a);
f2=find(E[i].b);
if(f1==f2) continue;
Union(f1,f2);
E[i].flag=1;
}
ans=0;
for(i=0;i<K;i++) if(E[i].flag) ans=MAX(ans,E[i].len);
return ans;
}
int main()
{
int T;
int i,l;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(n);
for(i=0;i<n;i++)
for(l=0;l<n;l++)
scanf("%d",&map[i][l]);
K=0;
for(i=1;i<n;i++)
{
for(l=i-1;l>=0;l--)
{
E[K].a=i;
E[K].b=l;
E[K].len=map[i][l];
K++;
}
}
qsort(E,K,sizeof(E[0]),cmp);
printf("%d\n",Krustal());
}
return 0;
}