#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX = 3000+9;
inline int read() {
char ch = getchar();int f = 1, x = 0;
while(ch<'0' || ch>'9') {if(ch == '-') f = -1; ch = getchar();}
while(ch>='0' && ch<='9') {x = (x<<1)+(x<<3)+ch-'0'; ch = getchar();}
return x*f;
}
int n, m, k;
int val[MAX];
struct edge{
int y, nxt, cost;
}e[MAX];
int cnt, head[MAX];
void add_edge(int x, int y, int cost) {
e[++cnt].y = y;
e[cnt].cost = cost;
e[cnt].nxt = head[x];
head[x] = cnt;
}
int size[MAX], f[MAX][MAX];
void dfs(int s) {
size[s] = 1;
for(int i = head[s]; i; i = e[i].nxt) {
dfs(e[i].y);
size[s] += size[e[i].y];
for(int j = size[s]; j >= 0; j--) {
for(int k = 1; k < j && k <= size[e[i].y]; k++) {
f[i][j] = max(f[i][j], f[i][j-k]+f[e[i].y][k]-e[i].cost);
}
}
}
}
int main() {
n = read(), m = read();
int a, c;
for(int i = 1; i <= n-m; i++) {
k = read();
for(int j = 1; j <= k; j++) {
a = read(), c = read();
add_edge(i, a, c);
}
f[i][0] = 0;
}
for(int i = n-m+1; i <= n; i++) f[i][1] = read();
dfs(1);
int ans;
for(ans = n; ans >= 1; ans--) if(f[1][ans] >= 0) break;
printf("%d\n", ans);
return 0;
}