#include <bits/stdc++.h>
using namespace std;
const long long INF = 20000000000000ll;
const int inf = 200000000;
inline int re_ad() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar();
  return x * f;
}
long long ans = 0, sum = 0;
int n, S, T, cnt;
struct e {
  int v, nex;
  long long w;
} f[300010];
int bh[1010], head[1010], cure[1010];
inline long long mi(long long x, long long y) { return x > y ? y : x; }
inline void add(int x, int y, long long z) {
  f[cnt].v = y;
  f[cnt].w = z;
  f[cnt].nex = head[x];
  head[x] = cnt++;
}
inline int bfs(int s) {
  register int x;
  memset(bh, -1, sizeof(bh));
  bh[T] = 0;
  queue<int> q;
  q.push(T);
  while (!q.empty()) {
    x = q.front();
    q.pop();
    for (int i = head[x]; i + 1; i = f[i].nex)
      if (f[i ^ 1].w > 0 && bh[f[i].v] == -1) {
        bh[f[i].v] = bh[x] + 1;
        q.push(f[i].v);
      }
  }
  return bh[S] != -1;
}
long long find(int x, int y, long long l) {
  if (x == T) return l;
  long long a = l, b;
  for (int &i = cure[x]; i + 1; i = f[i].nex) {
    if (f[i].w && bh[f[i].v] + 1 == bh[x]) {
      b = find(f[i].v, y, mi(a, f[i].w));
      f[i].w -= b;
      f[i ^ 1].w += b;
      a -= b;
      if (a == 0) break;
    }
  }
  return l - a;
}
int main() {
  register int x, y, z, i, j, k;
  n = re_ad();
  S = 0;
  T = n * 2 + 1;
  memset(head, -1, sizeof(head));
  for (i = 1; i <= n; ++i) {
    k = re_ad();
    while (k--) {
      x = re_ad() + n;
      add(i, x, INF);
      add(x, i, 0);
    }
  }
  for (i = 1; i <= n; ++i) {
    x = re_ad();
    add(S, i, inf - x);
    add(i, S, 0);
    ans += inf - x;
  }
  for (i = n + 1; i <= T; ++i) add(i, T, inf), add(T, i, 0);
  while (bfs(S)) {
    for (i = 0; i <= T; i++) cure[i] = head[i];
    ans -= find(S, T, INF);
  }
  cout << mi(-ans, 0) << endl;
}
