#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=105;
int n;
bool map[maxn][maxn],instack[maxn];
int dfn[maxn],low[maxn],stap[maxn],belong[maxn],cnt,ccnt,stop;
int indegree[maxn],outdegree[maxn];
void tarjan(int i)
{
int v,u=i;
dfn[u]=low[u]=++cnt;
instack[i]=true;
stap[stop++]=u;
for(v=1; v<=n; v++)
if(map[u][v])
{
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ccnt++;
while(true)
{
v=stap[--stop];
belong[v]=ccnt;
instack[v]=false;
if(v==u) break;
}
}
}
void output()
{
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
int incnt,outcnt;
incnt=outcnt=0;
for(int u=1; u<=n; u++)
for(int v=1; v<=n; v++)
if(map[u][v]&&belong[u]!=belong[v])
{
indegree[belong[v]]++;
outdegree[belong[u]]++;
}
for(int i=1; i<=ccnt; i++)
{
if(!indegree[i]) incnt++;
if(!outdegree[i]) outcnt++;
}
if(ccnt==1)
cout<<"1"<<endl<<"0"<<endl;
else
cout<<incnt<<endl<<max(incnt,outcnt)<<endl;
}
int main()
{
int v;
while(cin>>n)
{
stop=ccnt=cnt=0;
memset(belong,0,sizeof(belong));
memset(dfn,0,sizeof(dfn));
memset(map,0,sizeof(map));
for(int i=1; i<=n; i++)
while(cin>>v&&v)
map[i][v]=true;
for(int i=1; i<=n; i++)
if(!dfn[i])
tarjan(i);
output();
}
return 0;
}