#include <bits/stdc++.h>
using namespace std;
const int VSIZE = 1500;
const int ESIZE = 900000;
const int MAX = 0x2F3F3F3F;
const int INF = 2 * MAX;
struct Edge {
  int from, to, next, v;
} edge[ESIZE];
int head[VSIZE], now;
int d[VSIZE], pre[VSIZE], cur[VSIZE], low[VSIZE], gap[VSIZE], pree[VSIZE];
int N, s, t;
void add_Edge(int from, int to, int v) {
  edge[now].from = from;
  edge[now].to = to;
  edge[now].v = v;
  edge[now].next = head[from];
  head[from] = now++;
  edge[now].from = to;
  edge[now].to = from;
  edge[now].v = 0;
  edge[now].next = head[to];
  head[to] = now++;
}
int SAP() {
  int flow = 0, i;
  bool flag;
  memset(low, 0, sizeof(low));
  memset(gap, 0, sizeof(gap));
  memset(d, 0, sizeof(d));
  for (i = 0; i < N; i++) cur[i] = head[i];
  low[s] = MAX;
  gap[0] = N;
  int u = s, v;
  while (d[s] < N) {
    flag = true;
    for (i = cur[u]; i != -1; i = edge[i].next) {
      v = edge[i].to;
      cur[u] = i;
      if (edge[i].v && d[u] == d[v] + 1) {
        pre[v] = u;
        pree[v] = i;
        low[v] = min(low[u], edge[i].v);
        u = v;
        if (u == t) {
          do {
            edge[pree[u]].v -= low[t];
            edge[pree[u] ^ 1].v += low[t];
            u = pre[u];
          } while (u != s);
          flow += low[t];
        }
        flag = false;
        break;
      }
    }
    if (flag) {
      gap[d[u]]--;
      if (!gap[d[u]]) return flow;
      d[u] = N;
      for (i = head[u]; i != -1; i = edge[i].next) {
        if (edge[i].v) d[u] = min(d[u], d[edge[i].to] + 1);
      }
      gap[d[u]]++;
      cur[u] = head[u];
      if (u != s) u = pre[u];
    }
  }
  return flow;
}
int main() {
  int n, m, i, j, k;
  scanf("%d", &n);
  s = 2 * n;
  t = 2 * n + 1;
  N = t + 1;
  now = 0;
  memset(head, -1, sizeof(head));
  for (i = 0; i < n; i++) {
    add_Edge(s, i, MAX);
    add_Edge(i + n, t, MAX);
  }
  for (i = 0; i < n; i++) {
    scanf("%d", &m);
    while (m--) {
      scanf("%d", &k);
      k--;
      add_Edge(i, k + n, INF);
    }
  }
  int sum = 0;
  for (i = 0; i < n; i++) {
    scanf("%d", &k);
    if (k > 0)
      add_Edge(i, t, k);
    else {
      sum += -k;
      add_Edge(s, i, -k);
    }
  }
  int ans = SAP() - n * MAX - sum;
  cout << ans << endl;
}
