#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int lim = 3e8;
const int N = 1010, M = 2e5 + 5;
struct edg {
  int to, nxt;
  long long w;
} e[M];
int cnt = 1, head[N], n, m, S, T, dep[N];
inline void add(int u, int v, int w) {
  cnt++;
  e[cnt].to = v;
  e[cnt].nxt = head[u];
  head[u] = cnt;
  e[cnt].w = w;
}
inline void Add(int u, int v, int w) {
  add(u, v, w);
  add(v, u, 0);
}
long long ans;
bool bfs() {
  memset(dep, -1, sizeof(dep));
  dep[S] = 0;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = e[i].nxt) {
      int v = e[i].to;
      if (e[i].w && dep[v] == -1) {
        dep[v] = dep[u] + 1;
        q.push(v);
      }
    }
  }
  return dep[T] != -1;
}
long long dfs(int u, long long f) {
  if (u == T) return f;
  long long w = 0, used = 0;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].to;
    if (e[i].w && dep[v] == dep[u] + 1) {
      w = dfs(v, min(e[i].w, f - used));
      used += w;
      e[i].w -= w, e[i ^ 1].w += w;
      if (used == f) return f;
    }
  }
  if (!used) dep[u] = -1;
  return used;
}
int main() {
  scanf("%d", &n);
  S = 2 * n + 1, T = 2 * n + 2;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &m);
    while (m--) {
      int x;
      scanf("%d", &x);
      Add(i, n + x, INF);
    }
  }
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    Add(S, i, lim - x);
    ans += lim - x;
  }
  for (int i = 1; i <= n; i++) Add(i + n, T, lim);
  while (bfs()) ans -= dfs(S, INF);
  printf("%lld", min(0LL, -ans));
  return 0;
}
