/*
TASK: CARS
AUTHOR: PETER PETROV
LANG: C++
*/

#include <cstdio>
#include <cstdlib>

using namespace std;


#define MAXN 500010
#define MAXM 5000010
#define MOD 987654321


int e[MAXM];    //spisyk s rebrata
int s[MAXN];
long long d[MAXN]; //kraen rezultat za vseki vryh
long long v[MAXN]; //kolko rebra vlizat vyv vyrha
int queue[4*MAXN];
int M=0, N;

int main() {

    //freopen("cars.in", "rt", stdin);
    //freopen("cars.out", "wt", stdout);

    scanf("%d", &N);

    int i, j, temp;

    for(i = 0; i <= N; i++)
         d[i] = v[i] = 0;

    for(i = 0; i < N; i++) {
        s[i] = M;
        scanf("%d", &temp);
        for(j = 0; j < temp; j++) {
            scanf("%d", &e[M++]);
            e[M-1]--;
            v[e[M-1]]++;
        }
    }
    
    s[i] = M;

    int top ,front;
    top = front = 0;
    int next;

    for(i = 0; i < N; i++)
        if(v[i] == 0){
            queue[top++] = i;
            break;
        }

    d[queue[front]] = 1;

    while(front != top) {
        next = queue[front++];
            for(i = s[next]; i < s[next+1]; i++) {
                d[e[i]] = d[e[i]] + d[next] ;
                if(d[e[i]] > 900000000000000000LL)
                    goto backup;
                v[e[i]]--;
                if (v[e[i]] == 0 )
                    queue[top++] = e[i];
            }
    }

backup:

    long long best = -1;
    for(i = 0; i < N; i++)
        if(d[i] > best)
            best = d[i];

    printf("%lld\n", best % MOD);

    //fclose(stdin);
    //fclose(stdout);

    return 0;
}

