#include <vector>#include <iostream>#include <cstring>#include <algorithm>usingnamespacestd;
constint maxn = 105;
vector<int> g[maxn];
vector<int> rg[maxn];
bool vis[maxn];
int order[maxn];
bool pre[maxn];
bool suf[maxn];
vector<int> tmp;
int n;
void dfs(int u){
for (int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if (vis[v])
continue;
vis[v] = true;
dfs(v);
}
tmp.push_back(u);
}
void rdfs(int u, int k){
order[u] = k;
for (int i = 0; i < rg[u].size(); i++){
int v = rg[u][i];
if (vis[v])
continue;
vis[v] = true;
rdfs(v, k);
}
}
void add(int u, int v){
g[u].push_back(v);
rg[v].push_back(u);
}
int scc(){
for (int i = 1; i <= n; i++){
if (!vis[i]){
vis[i] = true;
dfs(i);
}
}
memset(vis, 0, n+1);
int k = 0;
for (int i = n - 1; i >= 0; i--){
if (!vis[tmp[i]]){
vis[tmp[i]] = true;
rdfs(tmp[i], k++);
}
}
return k;
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for (int i = 1; i <= n; i++){
int v = -1;
while (true){
cin>>v;
if (v == 0)
break;
add(i, v);
}
}
int k = scc();
if (k == 1){
cout << 1 << endl << 0 << endl;
return0;
}
for (int i = 1; i <= n; i++){
for (int j = 0; j < g[i].size(); j++){
int v = g[i][j];
if (order[i] != order[v]){
pre[order[v]]= true;
suf[order[i]] = true;
}
}
}
int cnt_pre = 0, cnt_suf = 0;
for (int i = 0; i < k; i++){
if (pre[i] == false)
cnt_pre++;
if (suf[i] == false)
cnt_suf++;
}
cout << cnt_pre << endl << max(cnt_suf, cnt_pre)<< endl;
return0;
}