#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <vector>#include <stack>using namespace std;int n, m;vector<int> g[101];bool flag[101];int dfn[101], f[101], low[101];int cnt, N;stack<int> s;void tarjan(int u){ dfn[u] = low[u] = ++cnt; flag[u] = true; s.push(u); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if (flag[v] && dfn[v] < low[u]) low[u] = dfn[v]; } if (low[u] == dfn[u]) { N++; int v; do { v = s.top(); s.pop(); flag[v] = false; f[v] = N; } while (u != v); }}int main(){ while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) g[i].clear(); for (int x, i = 1; i <= n; i++) while (scanf("%d", &x), x) g[i].push_back(x); memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); cnt = 0, N = 0; for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); if (N == 1) { printf("1\n0\n"); continue; } int in[101] = {0}, out[101] = {0}; for (int i = 1; i <= n; i++) for (int j = 0; j < g[i].size(); j++) if (f[i] != f[g[i][j]]) { in[f[i]]++; out[f[g[i][j]]]++; } int x = 0, y = 0; for (int i = 1; i <= N; i++) { if (!in[i]) x++; if (!out[i]) y++; } printf("%d\n%d\n", y, max(x, y)); } return 0;}