#include<iostream>
#include
<vector>
#include
<cmath>
using namespace std;
vector
<int>u[101];
vector
<int>v[101];
bool s[101];
bool noout[101],noin[101];
int stack[101];
int belong[101];
int n,m,indx;
int dfs1(int t)
{
    
if(s[t])
        
return 0;
    s[t]
=1;
    
int i;
    
for(i=0;i<u[t].size();i++)
    {
        dfs1(u[t][i]);
    }
    stack[
++stack[0]]=t;
    
return 0;
}
int dfs2(int t)
{
    
if(s[t])
        
return 0;
    s[t]
=1;
    
int i;
    
for(i=0;i<v[t].size();i++)
    {
        dfs2(v[t][i]);
    }
    belong[t]
=indx;
    
return 0;
}
int main()
{
    scanf(
"%d",&n);
    
int i,j;
    
for(i=1;i<=n;i++)
    {
        
while(1)
        {
            scanf(
"%d",&m);
            
if(m==0)
                
break;
            u[i].push_back(m);
            v[m].push_back(i);
        }
    }
    memset(s,
0,sizeof(s));
    
for(i=1;i<=n;i++)
    {
        dfs1(i);
    }
    memset(s,
0,sizeof(s));
    
for(i=stack[0];i>=1;i--)
    {
        
if(!s[stack[i]])
        {
            indx
++;
            dfs2(stack[i]);
        }
    }
    memset(noout,
1,sizeof(noout));
    memset(noin,
1,sizeof(noin));
    
for(i=1;i<=n;i++)
    {
        
for(j=0;j<u[i].size();j++)
        {
            
if(belong[i]!=belong[u[i][j]])
            {
                noout[belong[i]]
=0;
                noin[belong[u[i][j]]]
=0;
            }
        }
    }
    
int res1=0,res2=0;
    
for(i=1;i<=indx;i++)
    {
        
if(noout[i])
            res2
++;
        
if(noin[i])
            res1
++;
    }
    
if(indx==1)
    {
        printf(
"1\n");
        printf(
"0\n");
    }
    
else
    {
        printf(
"%d\n",res1);
        printf(
"%d\n",max(res1,res2));
    }
    system(
"pause");
    
return 0;
}