#include <bits/stdc++.h>
using namespace std;
const int N = 600 * 600, inf = 1e9;
struct edge {
  int to, pre, w;
} e[N << 1];
int u[N], l = 1;
void ins(int a, int b, int c) { e[++l] = (edge){b, u[a], c}, u[a] = l; }
int n, S, T;
void insert(int a, int b, int c) { ins(a, b, c), ins(b, a, 0); }
int Q[N], h[N], cur[N];
bool bfs() {
  for (int i = S; i <= T; i++) h[i] = -1;
  int l = 0, r = 1;
  Q[h[S] = 0] = S;
  while (l < r) {
    int x = Q[l++];
    for (int i = u[x]; i; i = e[i].pre)
      if (e[i].w && h[e[i].to] == -1) h[e[i].to] = h[x] + 1, Q[r++] = e[i].to;
  }
  return h[T] != -1;
}
int dfs(int x, int f) {
  if (x == T || !f) return f;
  int used = 0, w;
  for (int i = cur[x]; i; i = e[i].pre)
    if (e[i].w && h[e[i].to] == h[x] + 1) {
      w = min(e[i].w, f - used), w = dfs(e[i].to, w);
      e[i].w -= w;
      if (e[i].w) cur[x] = i;
      e[i ^ 1].w += w;
      used += w;
      if (used == f) break;
    }
  return used;
}
int dinic() {
  int ans = 0;
  while (bfs()) {
    for (int i = S; i <= T; i++) cur[i] = u[i];
    ans += dfs(S, inf);
  }
  return ans;
}
vector<int> c[N];
void init() { memset(u, 0, sizeof(u)), l = 1; }
int q[N];
void match() {
  init();
  S = 0, T = 2 * n + 1;
  for (int i = 1; i <= n; i++) insert(S, i, 1), insert(n + i, T, 1);
  int t = l;
  for (int i = 1; i <= n; i++) {
    int len = c[i].size();
    for (int j = 0; j < len; j++) insert(i, n + c[i][j], 1);
  }
  dinic();
  for (int i = t + 1; i <= l; i += 2)
    if (!e[i].w) q[e[i].to - n] = e[i ^ 1].to;
}
void solve() {
  init();
  S = 0, T = 2 * n + 1;
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    int c;
    scanf("%d", &c);
    c = -c;
    if (c > 0)
      insert(S, i, c), ans += c;
    else
      insert(i, T, -c);
  }
  for (int i = 1; i <= n; i++) {
    int len = c[i].size();
    for (int j = 0; j < len; j++) insert(i, n + c[i][j], inf);
  }
  for (int i = 1; i <= n; i++) insert(n + i, q[i], inf);
  ans -= dinic();
  printf("%d\n", -ans);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int t;
    scanf("%d", &t);
    for (int j = 0; j < t; j++) {
      int x;
      scanf("%d", &x);
      c[i].push_back(x);
    }
  }
  match();
  solve();
  return 0;
}
