constint N = 5e3 + 10; int d[N], siz[N], val[N]; int f[N][N];
structEdge { int v, next, w; }e[N]; int head[N], cnt;
inlinevoidadd(int u, int v, int w){ e[++cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt; }
voiddfs(int u, int fa){ f[u][0] = 0; for(int i = head[u]; i; i = e[i].next) { int v = e[i].v; if(v == fa) continue; dfs(v, u); siz[u] += siz[v]; for(int j = siz[u];j >= 0; j--) { for(int k = 1;k <= min(j, siz[v]); k++) { f[u][j] = max(f[u][j], f[u][j - k] + f[v][k] - e[i].w); } } } if(d[u] == 1) f[u][1] = val[u], siz[u] = 1; }
voidsolve(){ int n, m; cin >> n >> m; mem(f, -INF); for(int i = 1;i <= n - m; i++) { int k; cin >> k; for(int j = 1;j <= k; j++) { int a, c; cin >> a >> c; d[i]++; d[a]++; add(i, a, c); add(a, i, c); } } for(int i = n - m + 1;i <= n; i++) cin >> val[i]; dfs(1, -1); for(int i = m;i >= 0; i--) { if(f[1][i] >= 0) { cout << i << endl; return ; } } }