#include<cstdio>
#include<cstring>
int a,rd[1005],t,n,head[1005],line,x,y,fa[1005][20],sta[1005],d[1005],top,tail,f[1000];
struct le
{
int t,w,next;
}edge[1005];
void init()
{
top=line=0;
tail=1;
memset(fa,0,sizeof(fa));
memset(head,0,sizeof(head));
memset(rd,0,sizeof(rd));
memset(d,0,sizeof(d));
}
void add(int x,int y)
{
edge[++line].t=x;
edge[line].w=y;
edge[line].next=head[x];
rd[y]++;
head[x]=line;
}
void bef(int x)
{
sta[1]=x;
d[x]=1;
for (;top<tail;)
{
for (int i=head[sta[++top]];i!=0;i=edge[i].next)
{
int j=edge[i].w;
d[j]=d[sta[top]]+1;
sta[++tail]=j;
fa[j][0]=sta[top];
}
for (int i=fa[sta[top]][0],j=0;i!=0;i=fa[i][j++])
fa[sta[top]][j+1]=fa[i][j];
}
}
int lca(int x,int y)
{
int i=0;
if (d[x]<d[y])
{
for (;d[y]>d[x];i=0)
{
for (;d[fa[y][i]]>=d[x];i++);
y=fa[y][i - 1];
}
}
else
if (d[y]<d[x])
{
for (;d[x]>d[y];i=0)
{
for (;d[fa[x][i]]>=d[y];i++);
x=fa[x][i - 1];
}
}
for (;x!=y;)
{
for (i=1;fa[x][i]!=fa[y][i];i++);
x=fa[x][i-1];
y=fa[y][i-1];
}
return x;
}
int main()
{
scanf("%d",&n);
init();
for (int i=1;i<=n;i++)
{
scanf("%d:(%d)",&x,&y);
for (int j=1;j<=y;j++)
{
scanf("%d",&a);
add(x,a);
}
}
for (int i=1;i<=n;i++)
if (!rd[i])
{
bef(i);
break;
}
scanf("%d",&t);
for (int i=1;i<=t;i++)
{
scanf(" (%d%d)",&x,&y);
f[lca(x,y)]++;
}
for (int i=1;i<=n;i++)
if (f[i]!=0) printf("%d:%d\n",i,f[i]);
}
#include<cstring>
int a,rd[1005],t,n,head[1005],line,x,y,fa[1005][20],sta[1005],d[1005],top,tail,f[1000];
struct le
{
int t,w,next;
}edge[1005];
void init()
{
top=line=0;
tail=1;
memset(fa,0,sizeof(fa));
memset(head,0,sizeof(head));
memset(rd,0,sizeof(rd));
memset(d,0,sizeof(d));
}
void add(int x,int y)
{
edge[++line].t=x;
edge[line].w=y;
edge[line].next=head[x];
rd[y]++;
head[x]=line;
}
void bef(int x)
{
sta[1]=x;
d[x]=1;
for (;top<tail;)
{
for (int i=head[sta[++top]];i!=0;i=edge[i].next)
{
int j=edge[i].w;
d[j]=d[sta[top]]+1;
sta[++tail]=j;
fa[j][0]=sta[top];
}
for (int i=fa[sta[top]][0],j=0;i!=0;i=fa[i][j++])
fa[sta[top]][j+1]=fa[i][j];
}
}
int lca(int x,int y)
{
int i=0;
if (d[x]<d[y])
{
for (;d[y]>d[x];i=0)
{
for (;d[fa[y][i]]>=d[x];i++);
y=fa[y][i - 1];
}
}
else
if (d[y]<d[x])
{
for (;d[x]>d[y];i=0)
{
for (;d[fa[x][i]]>=d[y];i++);
x=fa[x][i - 1];
}
}
for (;x!=y;)
{
for (i=1;fa[x][i]!=fa[y][i];i++);
x=fa[x][i-1];
y=fa[y][i-1];
}
return x;
}
int main()
{
scanf("%d",&n);
init();
for (int i=1;i<=n;i++)
{
scanf("%d:(%d)",&x,&y);
for (int j=1;j<=y;j++)
{
scanf("%d",&a);
add(x,a);
}
}
for (int i=1;i<=n;i++)
if (!rd[i])
{
bef(i);
break;
}
scanf("%d",&t);
for (int i=1;i<=t;i++)
{
scanf(" (%d%d)",&x,&y);
f[lca(x,y)]++;
}
for (int i=1;i<=n;i++)
if (f[i]!=0) printf("%d:%d\n",i,f[i]);
}