#include <bits/stdc++.h>
using namespace std;
struct node {
  int flow, nexti, to;
} ro[2000005] = {{0}};
int n, m, p[10005], s, t, ans, q[1000005], qaq[10005], cnt = -1;
bool check[10005] = {false}, inq[10005];
void addedge(int fr, int to, int w) {
  cnt++;
  ro[cnt].to = to;
  ro[cnt].nexti = p[fr];
  ro[cnt].flow = w;
  p[fr] = cnt;
}
bool BFS() {
  memset(inq, false, sizeof(inq));
  memset(qaq, 0, sizeof(qaq));
  int l = 0, r = 1;
  q[r] = t;
  inq[t] = true;
  qaq[t] = 1;
  while (l < r) {
    l++;
    for (int i = p[q[l]]; i != -1; i = ro[i].nexti)
      if (!qaq[ro[i].to] && ro[i ^ 1].flow) {
        qaq[ro[i].to] = qaq[q[l]] + 1;
        if (!inq[ro[i].to]) {
          inq[ro[i].to] = true;
          q[++r] = ro[i].to;
        }
      }
    inq[q[l]] = false;
  }
  return qaq[s];
}
int dfs(int nowi, int fl) {
  int k1, fll = 0;
  if (nowi == t) return fl;
  check[nowi] = true;
  for (int i = p[nowi]; i != -1 && fll < fl; i = ro[i].nexti)
    if (!check[ro[i].to] && ro[i].flow && qaq[ro[i].to] == qaq[nowi] - 1) {
      k1 = dfs(ro[i].to, min(fl - fll, ro[i].flow));
      fll += k1;
      ro[i].flow -= k1;
      ro[i ^ 1].flow += k1;
    }
  if (fll == fl) check[nowi] = false;
  return fll;
}
int Dinic() {
  int ret = 0;
  while (BFS()) {
    memset(check, false, sizeof(check));
    ret += dfs(s, 1e9);
  }
  return ret;
}
int main() {
  scanf("%d", &n);
  memset(p, -1, sizeof(p));
  cnt = -1;
  int x, y;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    for (int j = 1; j <= x; j++) {
      scanf("%d", &y);
      addedge(i, y + n, 1e9);
      addedge(y + n, i, 0);
    }
  }
  int sum = 0;
  s = 2 * n + 1, t = s + 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    sum += x - 5e6;
    addedge(s, i, 5e6 - x);
    addedge(i, s, 0);
    addedge(i + n, t, 5e6);
    addedge(t, i + n, 0);
  }
  printf("%d\n", sum + Dinic());
  return 0;
}
