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

#include<iostream>
#include<vector>
#define maxn 10001
#define pb push_back
using namespace std;

vector< vector<int> >a;
int i,j,n,m,p,z,k[maxn],leaf[maxn],prev[maxn];
bool used[maxn];
long long ans;

void init(){
//	freopen("store.in","rt",stdin);
    cin>>n>>m;

    vector<int>tmp;
    int t;
    for(i=1;i<=n+3;i++)a.pb(tmp);
    for(i=1;i<=n;i++){
    	cin>>k[i]>>p;
        if(p==0)leaf[++z]=i;
        for(j=1;j<=p;j++){
        	cin>>t;
            a[i].pb(t);
            prev[t]=i;
        }
    }


    //for(i=1;i<=n;i++)cout<<prev[i]<<" ";
    //for(i=1;i<=n;i++){cout<<endl<<i<<" v: ";
    //	for(j=0;j<a[i].size();j++)cout<<a[i][j]<<" ";}
}


int dfs(int v){
//cout<<"Current vertex "<<v<<endl;
	int s;
    int cur=k[v],t,k1;
    if(a[v].size()==0)return k[v];
    else {
    	for(s=0;s<a[v].size();s++){
        	t=dfs(a[v][s]);

            //---calc
            //cout<<"Current time za vryh "<<a[v][s]<<" ka6oni = "<<t<<" time= ";
            //int k1=2*t/m+2,k2=2*t/m;
            if(t%m!=0){
            	k1=t/m;
            	ans+=2*k1+2;
                //cout<<2*k1+2<<endl;
            }
    		else ans+=2*t/m;//cout<<"k2="<<k2<<endl;}
            //-------
            
			cur+=t;
    	}

    	//cout<<" pri vertex "<<v<<" current broi= "<<cur<<endl;
    	k[v]+=cur;

    	//if(cur%m>0)ans+=2*cur/m+2;
    	//else ans+=2*cur/m;
    }

    
    return cur;
}


void solve(){
	int aa=dfs(1);
    cout<<ans<<endl;
}

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

