#include <bits/stdc++.h>
using namespace std;
int num = -1, n, m, s, t, cur[100010], head[100010], deep[100010];
int val[100010];
long long ans;
struct Edge {
  int to, dis, next;
} edge[240010];
void add(int f, int t, int dis) {
  edge[++num] = {t, dis, head[f]};
  head[f] = num;
  edge[++num] = {f, 0, head[t]};
  head[t] = num;
}
queue<int> q;
bool bfs(int s, int t) {
  for (int i = 1; i <= t; i++) cur[i] = head[i];
  memset(deep, 0x3f3f3f3f, sizeof deep);
  while (!q.empty()) q.pop();
  q.push(s);
  deep[s] = 0;
  while (!q.empty()) {
    int nowp = q.front();
    q.pop();
    for (int i = head[nowp]; ~i; i = edge[i].next) {
      if (deep[edge[i].to] == 0x3f3f3f3f && edge[i].dis) {
        deep[edge[i].to] = deep[nowp] + 1;
        q.push(edge[i].to);
      }
    }
  }
  return deep[t] != 0x3f3f3f3f;
}
int dfs(int nowp, int t, int lim) {
  if (nowp == t || lim == 0) return lim;
  int f, ret = 0;
  for (int i = cur[nowp]; ~i; i = edge[i].next) {
    cur[nowp] = i;
    if (deep[edge[i].to] == deep[nowp] + 1 &&
        (f = dfs(edge[i].to, t, min(lim, edge[i].dis)))) {
      ret += f, lim -= f;
      edge[i].dis -= f, edge[i ^ 1].dis += f;
      if (!lim) break;
    }
  }
  return ret;
}
void dinic(int s, int t) {
  while (bfs(s, t)) ans += dfs(s, t, (long long)1e9);
}
int get_num(int x, bool fg) { return fg * n + x; }
int main() {
  memset(head, -1, sizeof head);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int T;
    scanf("%d", &T);
    while (T--) {
      int p;
      scanf("%d", &p);
      add(get_num(i, 0), get_num(p, 1), (long long)1e9);
    }
  }
  s = n + n + 1, t = s + 1;
  for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
  for (int i = 1; i <= n; i++) {
    add(s, get_num(i, 0), (long long)1e9 - val[i]);
    add(get_num(i, 1), t, (long long)1e9);
  }
  dinic(s, t);
  long long anss = (long long)1e9 * n;
  for (int i = 1; i <= n; i++) anss -= val[i];
  printf("%lld\n", ans - anss);
}
