#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 3e3+10;
const int inf = 0x3f3f3f3f;
int n,m;
int val[N];
struct edge{
int next,to,w;
}a[N<<4];
int head[N],cnt;
int fa[N],size[N];
int f[N][N],vis[N];
void add(int u,int v,int w){
a[++cnt]=(edge){head[u],v,w};
head[u]=cnt;
}
int dfs(int x){
if(val[x]){
f[x][1]=val[x];
return 1;
}
int sum=0,t;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
t=dfs(v);
sum+=t;
for(int j=sum;j>=1;--j)
for(int k=1;k<=t;++k) f[x][j]=max(f[x][j],f[x][j-k]+f[v][k]-a[i].w);
}
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,k;i<=n-m;++i){
scanf("%d",&k);
for(int j=1,x,y;j<=k;++j){
scanf("%d%d",&x,&y);
add(i,x,y);
}
}
for(int i=n-m+1;i<=n;++i) scanf("%d",&val[i]);
memset(f,-inf,sizeof(f));
for(int i=1;i<=n;++i) f[i][0]=0;
dfs(1);
for(int i=m;i>=1;--i){
if(f[1][i]>=0){
printf("%d",i);
break;
}
}
return 0;
}