/*
TASK:store
LANG:C
*/

#include <stdio.h>
#include <stdlib.h>

#define MAX 10005 /* 10 005 */

#define MOD 1000000000 /* 1 000 000 000 */

typedef struct node *link;
struct node { int v; link next; };

void input(void);
void solve(void);

int DFS_S(int a);
int DFS_F(int a);

link new_link(int v, link next);

int n, m;
link G[MAX]; /* graph */
int  Z[MAX]; /* quantity */
int  S[MAX]; /* quantity in subtree */
int  F[MAX]; /* DP array */

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

void input(void)
{
  int a, b, c;
  int i, j;
  
  scanf("%d %d", &n, &m);
  
  for(i = 1; i <= n; i++) G[i] = NULL;
  
  for(i = 1; i <= n; i++) {
    a = i;
    scanf("%d", &Z[i]);
    scanf("%d", &c);
    for(j = 1; j <= c; j++) {
      scanf("%d", &b);
      G[a] = new_link(b, G[a]);
    }
  }
}
      
void solve(void) 
{
  DFS_S(1);
  printf("%d\n", DFS_F(1));
}

int DFS_S(int a)
{
  link p;
  
  S[a] = Z[a];
  for(p = G[a]; p != NULL; p = p->next)
    S[a] += DFS_S(p->v);
    
  return S[a];
}

int DFS_F(int a)
{
  link p;
  int pot;
  
  F[a] = 0;
  for(p = G[a]; p != NULL; p = p->next) {
    F[a] = (F[a] + DFS_F(p->v)) % MOD;
    pot = S[p->v] / m; if(S[p->v] % m) pot++;
    pot *= 2;
    F[a] = (F[a] + pot) % MOD;
  }
  
  return F[a];
}
      
link new_link(int v, link next)
{
  link x = malloc(sizeof(*x));
  
  x->v = v; x->next = next;
  
  return x;
}

