/*
ID: niepeng1
PROG: schlnet
LANG: C++
*/
/*
额,没有写出来,直接看例程。
这个对后继的判定存储很巧。其实我还是有点晕。
*/
#include <stdio.h>
#include <memory.h>
struct node{
int st;
int et;
}sta[100],temp[100];
int i,j,n,t,a[100][100],blo[100],res[100][2],innum,outnum;
bool yet[100],rela[100][100];
void dfs(int x)
{
int i;
t++;
sta[x].st=t;
yet[x]=true;
for(i=1;i<=a[x][0];i++)
if(yet[a[x][i]]==false)
dfs(a[x][i]);
t++;
sta[x].et=t;
}
int main()
{
freopen("schlnet.in","r",stdin);
freopen("schlnet.out","w",stdout);
memset(rela,false,sizeof(rela));
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i][0]=0;
while(scanf("%d",&t)&&t)
{
a[i][++a[i][0]]=t-1;
rela[i][t-1]=true;
}
}
memset(yet,false,sizeof(yet));
memset(sta,0,sizeof(sta));
t=0;
for(i=0;i<n;i++) if(!yet[i]) dfs(i);
memcpy(temp,sta,sizeof(sta));
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
for(j=n-1;j>=0;j--)
if(rela[i][j]) a[j][++a[j][0]]=i;
memset(yet,false,sizeof(yet));
t=0;
for(i=0;i<n;i++) if(!yet[i]) dfs(i);
memset(yet,false,sizeof(yet));
memset(blo,-1,sizeof(blo));
t=-1;
for(i=0;i<n;i++)
if(!yet[i])
{
t++;
blo[i]=t;
yet[j]=true;
for(j=0;j<n;j++)
if(!yet[j]&&temp[j].st>temp[i].st&&temp[j].et<temp[i].et&&
sta[j].st>sta[i].st&&sta[j].et<sta[i].et)
{
blo[j]=t;
yet[j]=true;
}
}
if(!t)
{
printf("1/n0/n");
return 0;
}
memset(res,0,sizeof(res));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(rela[i][j]&&blo[j]!=blo[i])
{
res[blo[i]][1]++;
res[blo[j]][0]++;
}
innum=outnum=0;
for(i=0;i<=t;i++)
{
if(!res[i][0]) innum++;
if(!res[i][1]) outnum++;
}
printf("%d/n",innum);
if(outnum>innum) printf("%d/n",outnum);
else printf("%d/n",innum);
return 0;
}a