//たぶんこんな感じで辺を張ったらできそうと思ったので辺を張ってみた(本当に?) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) #define int long long using namespace std; using namespace atcoder; const int INF = 1e+13; int n, m; int a[100]; int b[100]; vector ids[100]; signed main() { int i, j; cin >> n >> m; rep(i, n) cin >> a[i]; rep(i, m) cin >> b[i]; rep(i, m) { int mofu; cin >> mofu; rep(j, mofu) { int meu; cin >> meu; meu--; ids[i].push_back(meu); } } mf_graph graph(n + m + 2); int s = n + m, t = n + m + 1; rep(i, n) { graph.add_edge(s, i, a[i]); } rep(i, m) { graph.add_edge(n + i, t, b[i]); } rep(i, m) { rep(j, ids[i].size()) { int u = ids[i][j]; int v = n + i; graph.add_edge(u, v, INF); } } int flow = graph.flow(s, t); int ans = 0; rep(i, m) ans += b[i]; ans -= flow; cout << ans << endl; return 0; }