/*
TASK:store
LANG:C++
*/
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

#define MAXN 10001
#define MOD 1000000000

int pred[MAXN];
int st[MAXN];
int tt[MAXN];
int tov[MAXN];
int N, M;

int main() {
    
    scanf("%d%d", &N, &M);
    
    int a, b;
    for (int i = 0; i < N; i++) {
        scanf("%d%d", &a, &b);
        tov[i] = a;
        st[i] = b;
        for (int j = 0; j < b; j++) {
            scanf("%d", &a);
            pred[--a] = i;
        }
    }

    queue <int> q;
    
    for (int i = 0; i < N; i++) {
        if (st[i] == 0) {
           q.push(i);
        }
    }
    
    int cur;
    while (!q.empty()) {
        cur = q.front();
        q.pop();
        if (cur == 0) {
            break;
        }
        tov[pred[cur]] += tov[cur];
        tt[pred[cur]] = (tt[pred[cur]] + (tov[cur]/M + (tov[cur]%M?1:0))*2) % MOD;
        tt[pred[cur]] = (tt[pred[cur]] + tt[cur]) % MOD;
        st[pred[cur]]--;
        if (st[pred[cur]] == 0) {
            q.push(pred[cur]);
        }
    }
    
    printf("%d\n", tt[0]);
    
    return 0;
}
