#include <cstdio>
using namespace std;
int link[50][50][2];
bool out[50][50], vis[50][50];
bool check(int x, int y, int u, int v) {
if (out[x][u] && !out[y][v]) {
return false;
}
if (vis[u][v]) {
return true;
}
vis[u][v] = true;
if (!check(x, y, link[x][u][0], link[y][v][0])) {
return false;
}
if (!check(x, y, link[x][u][1], link[y][v][1])) {
return false;
}
return true;
}
int dis[50][50];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int S;
scanf("%d", &S);
for (int n, m, i = 0; i < S; i++) {
scanf("%d %d", &n, &m);
for (int j = 0, x; j < m; j++) {
scanf("%d", &x);
out[i][x] = true;
}
for (int j = 0; j < n; j++) {
scanf("%d %d", &link[i][j][0], &link[i][j][1]);
}
}
for (int i = 0; i < S; i++) {
for (int j = 0; j < S; j++) {
dis[i][j] = -114514;
if (i != j) {
for (int k = 0; k < 50; k++) {
for (int l = 0; l < 50; l++) {
vis[k][l] = false;
}
}
if (check(i, j, 0, 0)) {
dis[i][j] = 1;
}
}
}
}
int ans = 0;
for (int k = 0; k < S; k++) {
for (int i = 0; i < S; i++) {
for (int j = 0; j < S; j++) {
dis[i][j] = max(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
for (int i = 0; i < S; i++) {
for (int j = 0; j < S; j++) {
ans = max(ans, dis[i][j]);
}
}
printf("%d", ans + 1);
return 0;
}