#include<bits/stdc++.h>
using namespace std;
const int N = 3010;
int n,m;
struct Edge{
int from;
int to;
int val;
int next;
} edge[2*N];
int head[N],give[N];
int cnt = 0;
int dp[N][N];
void add(int u,int v,int w){
cnt++;
edge[cnt].from = u;
edge[cnt].to = v;
edge[cnt].val = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
int dfs(int id){
if(id>n-m){
dp[id][1] = give[id];
dp[id][0] = 0;
return 1;
}
dp[id][0] = 0;
int Size = 0;
for(int i = head[id]; i; i = edge[i].next){
int v = edge[i].to;
int t = dfs(v);
Size+=t;
for(int sum = Size; sum > 0; sum--){
for(int nowsum = 0; nowsum <= min(sum,t); nowsum++){
dp[id][sum] = max(dp[id][sum],dp[v][nowsum]+dp[id][sum-nowsum]-edge[i].val);
}
}
}
return Size;
}
int main(){
memset(dp,0x8f,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i = 1; i <= n-m; i++){
int k,a,c;
scanf("%d",&k);
while(k--){
scanf("%d%d",&a,&c);
add(k,a,c);
}
}
for(int i = n-m+1; i <= n; i++) scanf("%d",&give[i]);
memset(dp,0,sizeof(dp[0]));
dfs(1);
for(int i = m; i >= 0; i--){
if(dp[1][i]>=0){
printf("%d",i);
return 0;
}
}
return 0;
}