/*
TASK:store
LANG:C++
*/
#include<stdio.h>
#include<utility>
#include<algorithm>

#define PII pair <int, int>

#define x first
#define y second
#define mod 1000000000

#define maxn 16384

using namespace std;
int N, M;
PII E[maxn*2]; int top = 0;
int A[maxn] = {0};
int p[maxn];

long long best[maxn];
long long u, r;

void input();
void solve();
void dfs(int node);


int main()
{
input();
solve();
return 0;
}


void solve()
{
dfs(1);
printf("%lld\n", best[1]);
}


void dfs(int node)
{
int i;

if(p[node] == -1) { best[node] = 0; return; }

for(i = p[node]; i < top && E[i].x == node; i++)
      {
      dfs(E[i].y);
      }



for(i = p[node]; i < top && E[i].x == node; i++)
      {
      u = A[E[i].y] / M;
      r = A[E[i].y] % M;
      if(r != 0) u++;
      best[node] = (best[node] + (u + u + best[E[i].y])) % mod;
      A[node] += A[E[i].y];
      }
}


void input()
{
int i, j, a, x;

scanf("%d%d", &N, &M);
for(i = 1; i <= N; i++)
      {
      scanf("%d", &A[i]);
      scanf("%d", &x);
      for(j = 1; j <= x; j++)
            {
            scanf("%d", &a);
            E[top].x = i;
            E[top].y = a;
            top++;
            }
      }
sort(E, E+top);

for(i = 1; i <= N; i++) p[i] = -1;

p[E[0].x] = 0;
for(i = 1; i < top; i++)
 if(E[i].x != E[i-1].x) p[E[i].x] = i;
}

            
