#include<bits/stdc++.h>
#define max(a,b) a>b?a:b
using namespace std;
const int maxn=3e3+5,maxcost=2e4+5;
int n,m,cnt,maxc;
int head[maxn],path[maxn],f[maxn][maxcost],bag[maxn][maxn];
struct node{
int next,to,cost;
}e[maxn];
inline void adde(int u,int v,int w){
e[++cnt].to=v;
e[cnt].cost=w;
e[cnt].next=head[u];
head[u]=cnt;
}
void bfs(int now,int len){
path[now]=len;
for(int i=head[now];i;i=e[i].next){
int v=e[i].to;
bfs(v,len+e[i].cost);
}
}
inline bool is_human(int u){
if(u<=n-m&&u>=1) return false;
return true;
}
void work(int now,int tot){
for(int i=head[now];i;i=e[i].next){
int v=e[i].to;
if(is_human(v)){
bag[now][++tot]=e[i].cost;
continue;
}
work(v,0);
int dis=path[v]-path[now];
for(int j=maxc-dis;j>=0;j--){
f[now][j+dis]=max(f[now][j+dis],f[v][j]);
}
}
for(int i=1;i<=tot;i++){
for(int j=maxc;j>=bag[now][i];j--){
f[now][j]=max(f[now][j],f[now][j-bag[now][i]]+1);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n-m;i++){
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++){
int v,w;
scanf("%d%d",&v,&w);
adde(i,v,w);
}
}
for(int i=1;i<=m;i++){
int w;
scanf("%d",&w);
maxc+=w;
}
bfs(1,0);
work(1,0);
printf("%d",f[1][maxc]);
return 0;
}