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

#include <cstdio>
//#include <conio.h>
#include <vector>
#include <algorithm>
using namespace std;

#define MN      10010
#define MAG     1000000000

vector<int> v[MN];
int f[MN];
int st[MN];
int sum[MN];
int ts[MN], cur_ts=0;
char u[MN];
int N,M;

void dfs(int i)
{
    u[i]=1;
    for (int k=0;k<v[i].size();++k) {
        if (!u[ v[i][k] ])
            dfs( v[i][k] );
    }
    ts[++cur_ts]=i;
}

int main()
{
    //freopen("store.in","r",stdin);  // !!
    
    scanf("%d%d",&N,&M);
    int x,y;
    for (int i=1;i<=N;++i) {
        scanf("%d%d",&st[i],&x);
        for (int j=0;j<x;++j) {
            scanf("%d",&y);
            v[i].push_back(y);
        }
    }
    
    memset(u,0,sizeof(u));
    dfs(1);
    //for (int i=1;i<=N;++i) printf("%d: %d\n",i,ts[i]);
    
    for (int k=1;k<=N;++k) {
        int i=ts[k];
        sum[i]=st[i];
        
        for (int l=0;l<v[i].size();++l) {
            int j=v[i][l];
            
            sum[i] += sum[j];
        }
    }
    //for (int i=1;i<=N;++i) printf("sum %d: %d\n",i,sum[i]);
    
    for (int k=1;k<=N;++k) {
        int i=ts[k];
        f[i]=0;
        
        for (int l=0;l<v[i].size();++l) {
            int j=v[i][l];
            //f[i] = f[i] + f[j] + 2*((sum[j]+M-1)/M);
            f[i] = ((f[i] + f[j])%MAG + (2*((sum[j]+M-1)/M))%MAG) % MAG;
        }
    }
    
    printf("%d\n",f[1]);
    
    //getch();
    return 0;
}
