#include <bits/stdc++.h>
const int maxn = 605;
const int INF = 1000000000;
struct {
  int v, c, next;
} edge[1000000];
int E, head[maxn];
int gap[maxn], cur[maxn];
int pre[maxn], dis[maxn];
void add_edge(int s, int t, int c, int cc) {
  edge[E].v = t;
  edge[E].c = c;
  edge[E].next = head[s];
  head[s] = E++;
  edge[E].v = s;
  edge[E].c = cc;
  edge[E].next = head[t];
  head[t] = E++;
}
int min(int a, int b) { return (a == -1 || b < a) ? b : a; }
int SAP(int s, int t, int n) {
  memset(gap, 0, sizeof(gap));
  gap[0] = n;
  memset(dis, 0, sizeof(dis));
  int i;
  for (i = 0; i < n; i++) cur[i] = head[i];
  int u = pre[s] = s, maxn_flow = 0, aug = -1, v;
  while (dis[s] < n) {
  loop:
    for (i = cur[u]; i != -1; i = edge[i].next) {
      v = edge[i].v;
      if (edge[i].c > 0 && dis[u] == dis[v] + 1) {
        aug = min(aug, edge[i].c);
        pre[v] = u;
        cur[u] = i;
        u = v;
        if (u == t) {
          for (u = pre[u]; v != s; v = u, u = pre[u]) {
            edge[cur[u]].c -= aug;
            edge[cur[u] ^ 1].c += aug;
          }
          maxn_flow += aug;
          aug = -1;
        }
        goto loop;
      }
    }
    int _min = n;
    for (i = head[u]; i != -1; i = edge[i].next) {
      v = edge[i].v;
      if (edge[i].c > 0 && dis[v] < _min) {
        cur[u] = i;
        _min = dis[v];
      }
    }
    if ((--gap[dis[u]]) == 0) break;
    gap[dis[u] = _min + 1]++;
    u = pre[u];
  }
  return maxn_flow;
}
bool flag[maxn][maxn];
int my[maxn];
int main() {
  int n, m;
  int i, j, k;
  int s, t;
  while (scanf("%d", &n) != -1) {
    memset(flag, 0, sizeof(flag));
    s = n + n;
    t = s + 1;
    memset(head, -1, sizeof(head));
    E = 0;
    for (i = 0; i < n; i++) {
      scanf("%d", &m);
      while (m--) {
        scanf("%d", &k);
        k--;
        flag[i][k] = true;
      }
    }
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++)
        if (flag[i][j]) {
          add_edge(i, j + n, 1, 0);
        }
    }
    for (i = 0; i < n; i++) {
      add_edge(s, i, 1, 0);
      add_edge(i + n, t, 1, 0);
    }
    SAP(s, t, t + 1);
    int id = 0;
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++)
        if (flag[i][j]) {
          if (edge[id].c == 0) {
            my[j] = i;
          }
          id += 2;
        }
    }
    s = n;
    t = s + 1;
    memset(head, -1, sizeof(head));
    E = 0;
    int sum = 0;
    for (i = 0; i < n; i++) {
      scanf("%d", &k);
      if (k < 0) {
        add_edge(s, i, -k, 0);
        sum += -k;
      } else {
        add_edge(i, t, k, 0);
      }
    }
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++)
        if (flag[i][j]) {
          add_edge(i, my[j], INF, 0);
        }
    }
    int flow = SAP(s, t, t + 1);
    sum -= flow;
    printf("%d\n", -sum);
  }
  return 0;
}
