#include <bits/stdc++.h>
const int N = 3e3 + 5;
using namespace std;
int n , m;
struct edge {
int to , nxt , w;
};
edge e[N];
int cnt = 0 , head[N];
void add(int u , int v , int w){
e[ ++ cnt].to = v;
e[cnt].w = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
int f[N][N] , num[N];
int dfs(int u){
if(u <= n && u > n - m){
return num[u] = 1;
}
for(int i = head[u];i != 0;i = e[i].nxt){
int v = e[i].to , w = e[i].w;
num[u] += dfs(v);
for(int siz = num[u];siz >= 0; -- siz){
for(int j = 0;j <= num[v]; ++ j){
f[u][siz] = max(f[u][siz] , f[v][j] + f[u][siz - j] - w);
}
}
}
return num[u];
}
int main(){
for(int i = 0;i <= n; ++ i)f[i][0] = 0;
cin >> n >> m;
for(int i = 1;i <= n; ++ i){
for(int j = 1;j <= m; ++ j){
f[i][j] = -2147483646;
}
}
for(int u = 1 , v , w , k;u <= n - m; ++ u){
cin >> k;
for(int j = 1;j <= k; ++ j){
cin >> v >> w;
add(u , v , w);
}
}
for(int i = n - m + 1;i <= n; ++ i){
cin >> f[i][1];
}
dfs(1);
for(int siz = m;siz >= 0; -- siz){
if(f[1][siz] >= 0){
cout << siz << endl;
return 0;
}
}
}