#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void gg(T &res) {
  res = 0;
  T fh = 1;
  char ch = getchar();
  while ((ch > '9' || ch < '0') && ch != '-') ch = getchar();
  if (ch == '-') fh = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') res = res * 10 + ch - '0', ch = getchar();
  res *= fh;
}
inline int gi() {
  int x;
  gg(x);
  return x;
}
inline long long gl() {
  long long x;
  gg(x);
  return x;
}
const int MAXN = 610;
const int MAXM = 200010;
const int INF = 1e9;
const int BIG = 1e7;
int bt = 1, b[MAXN], NEXT[MAXM], to[MAXM], val[MAXM];
inline void add(int x, int y, int z) {
  NEXT[++bt] = b[x];
  b[x] = bt;
  to[bt] = y;
  val[bt] = z;
  NEXT[++bt] = b[y];
  b[y] = bt;
  to[bt] = x;
  val[bt] = 0;
}
int T, dis[MAXN], q[MAXN];
bool fc() {
  for (int i = 1; i <= T; i++) dis[i] = 0;
  dis[0] = 1;
  int l = 1, r = 0;
  q[++r] = 0;
  while (l <= r) {
    int x = q[l++];
    for (int i = b[x]; i; i = NEXT[i]) {
      if (!val[i] || dis[to[i]]) continue;
      dis[to[i]] = dis[x] + 1;
      if (to[i] == T) return 1;
      q[++r] = to[i];
    }
  }
  return 0;
}
int dfs(int x, int M) {
  if (x == T) return M;
  int ans = 0;
  for (int i = b[x]; i; i = NEXT[i]) {
    if (!val[i] || dis[x] + 1 != dis[to[i]]) continue;
    int r = dfs(to[i], min(val[i], M - ans));
    val[i] -= r;
    val[i ^ 1] += r;
    if ((ans += r) == M) return ans;
  }
  dis[x] = -1;
  return ans;
}
int main() {
  int n = gi();
  T = n + n + 1;
  for (int i = 1; i <= n; i++)
    for (int t = gi(); t--;) add(i, n + gi(), INF);
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    int x = BIG - gi();
    ans -= x;
    add(0, i, x);
    add(n + i, T, BIG);
  }
  while (fc()) ans += dfs(0, INF);
  printf("%I64d", ans);
  return 0;
}
