#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int n,mn,m,cnt;
int bel[55],siz[55],to[110],next[110],head[55],mx[55];
string f[55],p[55],g[55];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{
int i,sum=0;
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) dfs(to[i],x);
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) p[++sum]=f[to[i]];
f[x]="(";
sort(p+1,p+sum+1);
for(i=1;i<=sum;i++) f[x]+=p[i];
f[x]+=")";
}
void getrt(int x,int fa)
{
mx[x]=0,siz[x]=1;
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) getrt(to[i],x),siz[x]+=siz[to[i]],mx[x]=max(mx[x],siz[to[i]]);
mx[x]=max(mx[x],m-siz[x]);
mn=min(mn,mx[x]);
}
string get()
{
string tmp="";
m=rd();
int i,a;
memset(head,-1,sizeof(head)),cnt=0;
for(i=1;i<=m;i++)
{
a=rd();
if(a) add(a,i),add(i,a);
}
mn=1<<30,getrt(1,0);
for(i=1;i<=m;i++) if(mx[i]==mn)
{
dfs(i,0);
tmp=max(tmp,f[i]);
}
return tmp;
}
int main()
{
n=rd();
int i,j;
for(i=1;i<=n;i++) g[i]=get();
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++) if(g[i]==g[j]) break;
printf("%d\n",j);
}
return 0;
}//4 4 0 1 1 2 4 2 0 2 3 4 0 1 1 1 4 0 1 2 3
洛谷:树的同构