rt
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int const maxn=3e3+10;
int n,m,dp[maxn][maxn],p[maxn],ans;
struct edge{
int v,w;
};
vector<edge>mp[maxn];
int dfs(int u){
if(u>n-m){
dp[u][1]=p[u];
return 1;
}else{
int ssum=0;
for(int i=0;i<mp[u].size();i++){
int v=mp[u][i].v,w=mp[u][i].w,sum;
sum=dfs(v);
ssum+=sum;
for(int j=1;j<=sum;j++){
for(int k=m;k>0;k--){
if(k-j>=0) dp[u][k]=max(dp[u][k],dp[u][k-j]+dp[v][j]-w);
}
}
}
return ssum;
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
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;
mp[i].push_back({a,c});
}
}
for(int i=n-m+1;i<=n;i++) cin>>p[i];
memset(dp,~0x3f,sizeof(dp));
for(int i=1;i<=n;i++) dp[i][0]=0;
dfs(1);
for(int i=m;i>=0;i--){
if(dp[1][i]>=0){
cout<<i;
exit(0);
}
}
return 0;
}