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

#define CUTOFF (1000000000)

#include <cstdio>
#include <queue>
#include <cstring>

using namespace std;

short N, prev[10000], nbrs[10000];
long long M, boxCnt[10000];
long long f[10000];
queue<short> comRooms;

void input(void)
{
  short i, j, currNbr;
  scanf("%hd %Ld", &N, &M);
  for(i=0; i<N; ++i)
  {
    scanf("%Ld %hd", &boxCnt[i], &nbrs[i]);
    if(!nbrs[i])
      comRooms.push(i);
    for(j=0; j<nbrs[i]; ++j)
    {
      scanf("%hd", &currNbr);
      prev[currNbr-1]=i;
    }
  }
}

void calc(void)
{
  short curr;
  memset(f, 0, 10000*sizeof(f[0]));
  while(comRooms.front())
  {
    curr=comRooms.front();
    comRooms.pop();
    f[prev[curr]]=(((boxCnt[curr]/M+((boxCnt[curr]%M)?1:0))*2)+f[curr]+f[prev[curr]])%CUTOFF;
    boxCnt[prev[curr]]+=boxCnt[curr];
    if(--nbrs[prev[curr]]==0)
      comRooms.push(prev[curr]);
  }
}

int main(void)
{
  input();
  calc();
  printf("%Ld\n", f[0]);
  return 0;
}
