/*
TASK: store
LANG: C++
*/

#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const long long MOD = 1000000000;

struct node {
    int m;
    int time;
    int parent;
    int connected;
};

int n, M;
vector<node> A;
long long ans;

int main() {

    scanf("%d %d", &n, &M); A.resize(n);
    queue<int> Q;
    A[0].parent = -1;
    for(int i = 0; i < n; ++i) {
        scanf("%d %d", &A[i].m, &A[i].connected);
        for(int j = 0; j < A[i].connected; ++j) {
            int k1; scanf("%d", &k1);
            A[k1-1].parent = i;
        }
        if( !A[i].connected )
            Q.push(i);
    }


    while( !Q.empty() ) {
        int t = Q.front(); Q.pop();
        if( A[t].parent == -1 ) break;    
        A[A[t].parent].m += A[t].m;
        A[t].time = ((A[t].m / M + (A[t].m % M != 0))%MOD * 2)%MOD;
        A[A[t].parent].connected--;
        if( !A[A[t].parent].connected )
            Q.push( A[t].parent );
    }

    long long ans = 0;
    for(int i = 0; i < n; ++i)
        ans = (ans + A[i].time%MOD) % MOD;

    printf("%lld\n", ans);    

    return 0;
}
