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

#include <cstdio>

const int MAX_GN = 1 << 14;
const int MAX_GM = MAX_GN;//it is a tree

struct el {
	int to;
	int next;
	el () {}
	el (int _to, int _next) : to (_to), next (_next) {}
};

int N, C;//C-> carry
el buf[MAX_GM];
int vec[MAX_GN];
int prev[MAX_GN];
int bcnt[MAX_GN];

int q[MAX_GN];

void bfs () {
	int p3 = 0;
	q[p3++] = 0;
	for (int i = 0; i < p3; ++i)
		for (int j = vec[q[i]]; j != -1; j = buf[j].next)
			q[p3++] = buf[j].to;
}

int times (int a) {
	return (a / C) + !!(a % C);
}

int main () {
	scanf ("%d %d", &N, &C);

	int i, j, k;
	int a, bp = 0;
	for (i = 0; i < N; ++i) {
		scanf ("%d %d", bcnt + i, &k);
		vec[i] = -1;
		for (j = 0; j < k; ++j) {
			scanf ("%d", &a);
			--a;
			buf[bp] = el (a, vec[i]);
			vec[i] = bp++;
			prev[a] = i;
		}
	}
	prev[0] = -1;

/*
	for (i = 0; i < N; ++i) {
		printf ("%d (%d %d) ->", i, bcnt[i], prev[i]);
		for (j = vec[i]; j != -1; j = buf[j].next)
			printf (" %d", buf[j].to);
		printf ("\n");
	}
*/

	bfs ();
	int res = 0;
	for (i = N-1; i; --i) {
		res += times (bcnt[q[i]]) * 2;
//		printf ("%d -- %d\n", q[i], times (bcnt[q[i]]) * 2);
		bcnt[prev[q[i]]] += bcnt[q[i]];
	}
	printf ("%d\n", res);
	
	return 0;
}
