#include<stdio.h>
#include<algorithm>
#include<map>
struct int128{
unsigned long long a[2];
int128 operator <<(const size_t&o)const{
return (int128){a[0]<<o|a[1]>>64-o,a[1]<<o};
}
int128 operator |(const int128&o)const{
return (int128){a[0]|o.a[0],a[1]|o.a[1]};
}
bool operator <(const int128&o)const{
return a[0]==o.a[0]?a[1]<o.a[1]:a[0]<o.a[0];
}
}name[51];int size[51],head[51],m,n;
struct{int v,nxt;}e[51];
inline bool cmp(int a,int b){return name[a]<name[b];}
void dfs(int x,int f){
static int a[51];int tot=0;size[x]=1;name[x]={0,0};
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].v!=f){
dfs(e[i].v,x);
size[x]+=size[e[i].v];
a[tot++]=e[i].v;
}
std::sort(a,a+tot,cmp);
for(int i=0;i<tot;++i)name[x]=name[x]<<(size[a[i]]<<1)|name[a[i]];
name[x]=name[x]<<1|(int128){0,1};
}
int cent[2],tot;
void query(int x,int f){
size[x]=1;
bool flag=1;
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].v!=f){
query(e[i].v,x);
size[x]+=size[e[i].v];
}
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].v!=f&&size[e[i].v]>(size[x]>>1)){flag=0;break;}
if(flag&&n-size[x]<=(size[x]>>1))cent[tot++]=x;
}
int main(){
std::map<int128,int> MAP;
scanf("%d",&m);
for(int k=1;k<=m;++k){
scanf("%d",&n);
for(int i=1;i<=n;++i)head[i]=-1;tot=0;
int cnt=0;
for(int i=0;i<n;++i){
int x;scanf("%d",&x);
if(x){
e[cnt<<1]={x,head[i]},head[i]=cnt<<1;
e[cnt<<1|1]={i,head[x]},head[x]=cnt<<1|1;
++cnt;
}
}
query(1,0);
int128 NAME={0xffffffffffffffffull,0xffffffffffffffffull};
for(int i=0;i<tot;++i){
dfs(cent[i],0);
if(name[cent[i]]<NAME)NAME=name[cent[i]];
}
if(MAP.find(NAME)!=MAP.end())printf("%d\n",MAP[NAME]);
else printf("%d\n",MAP[NAME]=k);
}
return 0;
}