/*
TASK:store
LANG:C++
*/
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
unsigned long long n,m;
vector<unsigned long long> ma;
vector<vector<unsigned long long> > a;
vector<unsigned long long> parent;
stack<unsigned long long> dfs;
vector<bool> v;
unsigned long long result;


int main()
{
    cin>>n>>m;
    ma.resize(n);
    a.resize(n);
    parent.resize(n);
    v.resize(n);
    unsigned long long i,c,j,t;
    for(i=0;i<n;i++)
    {
         cin>>ma[i]>>c;
         for(j=0;j<c;j++)
         {
             cin>>t;
             t--;
             a[i].push_back(t);
             parent[t]=i;    
         }
    }
    
    dfs.push(0);
    
    while(!dfs.empty())
    {
       if(!v[dfs.top()])
       {     
          t=dfs.top();
          v[t]=true;
          for(i=0;i<a[t].size();i++)
          {
               dfs.push(a[t][i]);
          }
       }
       if(a[dfs.top()].empty() || v[dfs.top()])
       {
           if(dfs.top()==0)break;
           result+=((ma[dfs.top()]%m==0?(ma[dfs.top()]/m):(ma[dfs.top()]/m+1))*2)%1000000000;
           result=result%1000000000;
           ma[parent[dfs.top()]]+=ma[dfs.top()];
           dfs.pop();           
       }
    
    }
    
    cout<<result<<endl;
    
    
    return 0;
}
