#include <bits/stdc++.h>
using namespace std;
const int lim = 3e8 + 5;
const int inf = 0x3f3f3f3f;
int head[300005], to[300005], tot, nxt[300005], w[300005], dep[300005],
    cur[300005], s, t;
long long ans = 0;
void add(int u, int v, int w1) {
  nxt[++tot] = head[u];
  head[u] = tot;
  to[tot] = v;
  w[tot] = w1;
  nxt[++tot] = head[v];
  head[v] = tot;
  to[tot] = u;
  w[tot] = 0;
}
queue<int> q;
bool bfs() {
  memset(dep, 0, sizeof(dep));
  for (int i = 1; i <= 300005 - 5; i++) cur[i] = head[i];
  dep[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int e = head[u]; e != -1; e = nxt[e]) {
      int v = to[e];
      if (dep[v] == 0 && w[e]) {
        dep[v] = dep[u] + 1;
        q.push(v);
      }
    }
  }
  if (dep[t] == 0) return 0;
  return 1;
}
int dfs(int u, int dis) {
  if (u == t || dis == 0) return dis;
  int used = 0;
  for (int e = cur[u]; e != -1; e = nxt[e]) {
    cur[u] = e;
    int v = to[e];
    if (dep[v] == dep[u] + 1 && w[e]) {
      int di = dfs(v, min(dis, w[e]));
      if (di > 0) {
        dis -= di;
        used += di;
        w[e] -= di;
        w[e ^ 1] += di;
        if (dis == 0) break;
      }
    }
  }
  return used;
}
void dinic() {
  while (bfs()) {
    ans -= dfs(s, inf);
  }
  cout << min(-ans, 0ll) << endl;
}
int main() {
  memset(head, -1, sizeof(head));
  tot = -1;
  int n, x, u;
  cin >> n;
  s = n + n + 1;
  t = s + 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    for (int j = 1; j <= x; j++) {
      scanf("%d", &u);
      add(i, u + n, inf);
    }
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    ans += lim - x;
    add(s, i, lim - x);
    add(i + n, t, lim);
  }
  dinic();
  return 0;
}
