#include <bits/stdc++.h>
const int N = 300;
const long long inf = 1LL << 60;
inline int min(int x, int y) {
  if (x < y) return x;
  return y;
}
struct NetWork {
  static const int V = N * 2 + 2;
  static const int E = N * N + N + N;
  struct Edge {
    int to, cap, nxt;
    Edge() {}
    Edge(int _to, int _cap, int _nxt) : to(_to), cap(_cap), nxt(_nxt) {}
  } edge[E * 2 + 5];
  int Gsz, head[V + 5];
  inline void add_edge(int u, int v, int cap) {
    edge[Gsz] = Edge(v, cap, head[u]);
    head[u] = Gsz++;
    edge[Gsz] = Edge(u, 0, head[v]);
    head[v] = Gsz++;
  }
  int src, dest, n;
  void init(int _n) {
    n = _n;
    src = n++;
    dest = n++;
    for (int i = 0, i_END_ = n; i < i_END_; ++i) head[i] = -1;
    Gsz = 0;
  }
  int dist[V + 5], que[V + 5];
  bool bfs() {
    for (int i = 0, i_END_ = n; i < i_END_; ++i) dist[i] = -1;
    int L = 0, H = 0;
    que[H++] = src;
    dist[src] = 0;
    while (L < H) {
      int u = que[L++];
      for (int i = head[u]; ~i; i = edge[i].nxt) {
        int v = edge[i].to;
        if (edge[i].cap > 0 && dist[v] == -1) {
          dist[v] = dist[u] + 1;
          que[H++] = v;
        }
      }
    }
    return dist[dest] != -1;
  }
  int work[V + 5];
  int dfs(int u, int aug) {
    if (u == dest || aug == 0) return aug;
    int res = 0;
    for (int &i = work[u]; ~i; i = edge[i].nxt) {
      int v = edge[i].to;
      if (edge[i].cap > 0 && dist[v] == dist[u] + 1) {
        int tmp = dfs(v, min(edge[i].cap, aug));
        edge[i].cap -= tmp;
        edge[i ^ 1].cap += tmp;
        res += tmp;
        aug -= tmp;
        if (aug == 0) break;
      }
    }
    return res;
  }
  long long Dinic() {
    long long res = 0;
    while (bfs()) {
      for (int i = 0, i_END_ = n; i < i_END_; ++i) work[i] = head[i];
      res += dfs(src, (int)1e9);
    }
    return res;
  }
} nw;
int n, sum;
const int U = (int)4e8;
void input() {
  scanf("%d", &n);
  nw.init(n * 2);
  for (int i = 0, i_END_ = n; i < i_END_; ++i) {
    int m;
    scanf("%d", &m);
    for (int j = 0, j_END_ = m; j < j_END_; ++j) {
      int x;
      scanf("%d", &x);
      --x;
      nw.add_edge(i, x + n, (int)1e9);
    }
  }
  sum = 0;
  for (int i = 0, i_END_ = n; i < i_END_; ++i) {
    int val;
    scanf("%d", &val);
    val = -val;
    sum += val;
    nw.add_edge(nw.src, i, U + val);
    nw.add_edge(i + n, nw.dest, U);
  }
}
int main() {
  input();
  int tmp = (sum + U * (long long)n) - nw.Dinic();
  if (tmp < 0)
    puts("0");
  else
    printf("%d\n", -tmp);
  return 0;
}
