#include <vector>
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n) FOR(i,0,n)
struct edge{
int to, id;
edge(int to, int id) : to(to), id(id){}
edge(){}
};
struct unionfind {
vector<int> par, rank;
void init(int n) {
par.resize(n);
rank.resize(n);
for(int i = 0; i < n; i++) {
par[i] = i;
rank[i] = 0;
}
}
int find(int x) {
if(par[x] == x) return x;
else return par[x] = find(par[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return ;
if(rank[x] < rank[y]) par[x] = y;
else{
par[y] = x;
if(rank[x] == rank[y]) ++rank[x];
}
}
bool same(int x, int y) { return (find(x) == find(y)); }
} uf;
int n;
int now;
vector<edge> g[5010];
vector<edge> in[5010];
bool vis[5010];
vector<int> v[5010];
vector<int> gg[100010];
int dp[100010];
vector<int> vs;
vector<int> em;
void predfs(int v){
vis[v] = true;
rep(i, g[v].size()){
in[g[v][i].to].pb(edge(v, g[v][i].id));
if(!vis[g[v][i].to]) predfs(g[v][i].to);
}
}
void dfs(int v){
vis[v] = true;
rep(i, gg[v].size()){
if(!vis[gg[v][i]]) dfs(gg[v][i]);
}
vs.pb(v);
}
int main(){
scanf("%d", &n);
rep(i, n - 1){
int k;
scanf("%d", &k);
g[i].resize(k);
rep(j, k){
int x;
scanf("%d", &x);
--x;
g[i][j] = edge(x, now++);
}
}
predfs(0);
rep(i, n) reverse(in[i].begin(), in[i].end());
uf.init(now * 2);
rep(i, n){
rep(j, in[i].size()){
v[i].pb(in[i][j].id * 2 + 1);
v[i].pb(in[i][j].id * 2);
}
rep(j, g[i].size()){
v[i].pb(g[i][j].id * 2);
v[i].pb(g[i][j].id * 2 + 1);
}
rep(j, (int)v[i].size() / 2 - 1){
uf.unite(v[i][j * 2 + 1], v[i][j * 2 + 2]);
}
uf.unite(v[i][0], v[i].back());
}
rep(i, now * 2) em.pb(uf.find(i));
sort(em.begin(), em.end());
em.erase(unique(em.begin(), em.end()), em.end());
rep(i, n){
rep(j, g[i].size()){
int u = uf.find(g[i][j].id * 2);
u = lower_bound(em.begin(), em.end(), u) - em.begin();
int v = uf.find(g[i][j].id * 2 + 1);
v = lower_bound(em.begin(), em.end(), v) - em.begin();
if(v != 0) gg[u].pb(v);
}
}
rep(i, em.size()){
sort(gg[i].begin(), gg[i].end());
gg[i].erase(unique(gg[i].begin(), gg[i].end()), gg[i].end());
}
memset(vis, 0, sizeof(vis));
rep(i, em.size()){
if(vis[i] || !gg[i].size()) continue;
dfs(i);
}
reverse(vs.begin(), vs.end());
dp[0] = 1;
rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
printf("%d\n", *max_element(dp, dp + (int)em.size()));
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBGT1IoaSxhLGIpIGZvcihpbnQgaT0oYSk7aTwoYik7KytpKQojZGVmaW5lIHJlcChpLG4pICBGT1IoaSwwLG4pCgpzdHJ1Y3QgZWRnZXsgCiAgICBpbnQgdG8sIGlkOwogICAgZWRnZShpbnQgdG8sIGludCBpZCkgOiB0byh0byksIGlkKGlkKXt9CiAgICBlZGdlKCl7fQp9OwoKc3RydWN0IHVuaW9uZmluZCB7CiAgICB2ZWN0b3I8aW50PiBwYXIsIHJhbms7CgogICAgdm9pZCBpbml0KGludCBuKSB7CglwYXIucmVzaXplKG4pOwoJcmFuay5yZXNpemUobik7CgoJZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJICAgIHBhcltpXSA9IGk7CgkgICAgcmFua1tpXSA9IDA7Cgl9CiAgICB9CgogICAgaW50IGZpbmQoaW50IHgpIHsKCWlmKHBhclt4XSA9PSB4KSByZXR1cm4geDsKCWVsc2UgcmV0dXJuIHBhclt4XSA9IGZpbmQocGFyW3hdKTsKICAgIH0KCiAgICB2b2lkIHVuaXRlKGludCB4LCBpbnQgeSkgewoJeCA9IGZpbmQoeCk7Cgl5ID0gZmluZCh5KTsKCWlmKHggPT0geSkgcmV0dXJuIDsKCglpZihyYW5rW3hdIDwgcmFua1t5XSkgcGFyW3hdID0geTsKCWVsc2V7CgkgICAgcGFyW3ldID0geDsKCSAgICBpZihyYW5rW3hdID09IHJhbmtbeV0pICsrcmFua1t4XTsKCX0KICAgIH0KCiAgICBib29sIHNhbWUoaW50IHgsIGludCB5KSB7IHJldHVybiAoZmluZCh4KSA9PSBmaW5kKHkpKTsgfQp9IHVmOwoKaW50IG47CmludCBub3c7CnZlY3RvcjxlZGdlPiBnWzUwMTBdOwp2ZWN0b3I8ZWRnZT4gaW5bNTAxMF07CmJvb2wgdmlzWzUwMTBdOwp2ZWN0b3I8aW50PiB2WzUwMTBdOwp2ZWN0b3I8aW50PiBnZ1sxMDAwMTBdOwppbnQgZHBbMTAwMDEwXTsKdmVjdG9yPGludD4gdnM7CnZlY3RvcjxpbnQ+IGVtOwoKdm9pZCBwcmVkZnMoaW50IHYpewogICAgdmlzW3ZdID0gdHJ1ZTsKICAgIHJlcChpLCBnW3ZdLnNpemUoKSl7CglpbltnW3ZdW2ldLnRvXS5wYihlZGdlKHYsIGdbdl1baV0uaWQpKTsKCWlmKCF2aXNbZ1t2XVtpXS50b10pIHByZWRmcyhnW3ZdW2ldLnRvKTsKICAgIH0KfQoKdm9pZCBkZnMoaW50IHYpewogICAgdmlzW3ZdID0gdHJ1ZTsKICAgIHJlcChpLCBnZ1t2XS5zaXplKCkpewoJaWYoIXZpc1tnZ1t2XVtpXV0pIGRmcyhnZ1t2XVtpXSk7CiAgICB9CiAgICB2cy5wYih2KTsKfQoKaW50IG1haW4oKXsKICAgIHNjYW5mKCIlZCIsICZuKTsKCiAgICByZXAoaSwgbiAtIDEpewoJaW50IGs7CglzY2FuZigiJWQiLCAmayk7CglnW2ldLnJlc2l6ZShrKTsKCXJlcChqLCBrKXsKCSAgICBpbnQgeDsKCSAgICBzY2FuZigiJWQiLCAmeCk7CgkgICAgLS14OwoJICAgIGdbaV1bal0gPSBlZGdlKHgsIG5vdysrKTsKCX0KICAgIH0KICAgIAogICAgcHJlZGZzKDApOwogICAgcmVwKGksIG4pIHJldmVyc2UoaW5baV0uYmVnaW4oKSwgaW5baV0uZW5kKCkpOwogICAgdWYuaW5pdChub3cgKiAyKTsKCiAgICByZXAoaSwgbil7CglyZXAoaiwgaW5baV0uc2l6ZSgpKXsKCSAgICB2W2ldLnBiKGluW2ldW2pdLmlkICogMiArIDEpOwoJICAgIHZbaV0ucGIoaW5baV1bal0uaWQgKiAyKTsKCX0KCglyZXAoaiwgZ1tpXS5zaXplKCkpewoJICAgIHZbaV0ucGIoZ1tpXVtqXS5pZCAqIDIpOwoJICAgIHZbaV0ucGIoZ1tpXVtqXS5pZCAqIDIgKyAxKTsKCX0KCglyZXAoaiwgKGludCl2W2ldLnNpemUoKSAvIDIgLSAxKXsKCSAgICB1Zi51bml0ZSh2W2ldW2ogKiAyICsgMV0sIHZbaV1baiAqIDIgKyAyXSk7Cgl9Cgl1Zi51bml0ZSh2W2ldWzBdLCB2W2ldLmJhY2soKSk7CiAgICB9CgogICAgcmVwKGksIG5vdyAqIDIpIGVtLnBiKHVmLmZpbmQoaSkpOwogICAgc29ydChlbS5iZWdpbigpLCBlbS5lbmQoKSk7CiAgICBlbS5lcmFzZSh1bmlxdWUoZW0uYmVnaW4oKSwgZW0uZW5kKCkpLCBlbS5lbmQoKSk7CgoKICAgIHJlcChpLCBuKXsKCXJlcChqLCBnW2ldLnNpemUoKSl7CgkgICAgaW50IHUgPSB1Zi5maW5kKGdbaV1bal0uaWQgKiAyKTsKCSAgICB1ID0gbG93ZXJfYm91bmQoZW0uYmVnaW4oKSwgZW0uZW5kKCksIHUpIC0gZW0uYmVnaW4oKTsKCSAgICBpbnQgdiA9IHVmLmZpbmQoZ1tpXVtqXS5pZCAqIDIgKyAxKTsKCSAgICB2ID0gbG93ZXJfYm91bmQoZW0uYmVnaW4oKSwgZW0uZW5kKCksIHYpIC0gZW0uYmVnaW4oKTsKCSAgICBpZih2ICE9IDApIGdnW3VdLnBiKHYpOwoJfQogICAgfQoKICAgIHJlcChpLCBlbS5zaXplKCkpewoJc29ydChnZ1tpXS5iZWdpbigpLCBnZ1tpXS5lbmQoKSk7CglnZ1tpXS5lcmFzZSh1bmlxdWUoZ2dbaV0uYmVnaW4oKSwgZ2dbaV0uZW5kKCkpLCBnZ1tpXS5lbmQoKSk7CiAgICB9CgogICAgbWVtc2V0KHZpcywgMCwgc2l6ZW9mKHZpcykpOwogICAgcmVwKGksIGVtLnNpemUoKSl7CglpZih2aXNbaV0gfHwgIWdnW2ldLnNpemUoKSkgY29udGludWU7CglkZnMoaSk7CiAgICB9CiAgICByZXZlcnNlKHZzLmJlZ2luKCksIHZzLmVuZCgpKTsKCiAgICBkcFswXSA9IDE7CiAgICByZXAoaSwgdnMuc2l6ZSgpKSByZXAoaiwgZ2dbdnNbaV1dLnNpemUoKSkgZHBbZ2dbdnNbaV1dW2pdXSA9IG1heChkcFtnZ1t2c1tpXV1bal1dLCBkcFt2c1tpXV0gKyAxKTsKICAgIAogICAgcHJpbnRmKCIlZFxuIiwgKm1heF9lbGVtZW50KGRwLCBkcCArIChpbnQpZW0uc2l6ZSgpKSk7CiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In function ‘void predfs(int)’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:67:5: note: in expansion of macro ‘rep’
rep(i, g[v].size()){
^
prog.cpp: In function ‘void dfs(int)’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:75:5: note: in expansion of macro ‘rep’
rep(i, gg[v].size()){
^
prog.cpp: In function ‘int main()’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:101:2: note: in expansion of macro ‘rep’
rep(j, in[i].size()){
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:106:2: note: in expansion of macro ‘rep’
rep(j, g[i].size()){
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:123:2: note: in expansion of macro ‘rep’
rep(j, g[i].size()){
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:132:5: note: in expansion of macro ‘rep’
rep(i, em.size()){
^
prog.cpp:137:31: error: ‘memset’ was not declared in this scope
memset(vis, 0, sizeof(vis));
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:138:5: note: in expansion of macro ‘rep’
rep(i, em.size()){
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:145:5: note: in expansion of macro ‘rep’
rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
#define rep(i,n) FOR(i,0,n)
^
prog.cpp:145:23: note: in expansion of macro ‘rep’
rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
^