#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n) {
  long long r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1) r = r * a % P;
  return r;
}
long long inv(long long first) {
  return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;
}
inline int rd() {
  int first = 0;
  char p = getchar();
  while (p < '0' || p > '9') p = getchar();
  while (p >= '0' && p <= '9') first = first * 10 + p - '0', p = getchar();
  return first;
}
const int N = 1e6 + 10;
int n, S, T, clk, f[N], vis[N];
vector<int> g[N];
int dfs(int first) {
  for (int second : g[first])
    if (vis[second] != clk) {
      vis[second] = clk;
      if (!f[second] || dfs(f[second])) return f[second] = first;
    }
  return 0;
}
struct edge {
  int v, w, next;
} e[N];
int head[N], dep[N], cur[N], cnt = 1;
queue<int> Q;
void add(int u, int v, int w) {
  e[++cnt] = {v, w, head[u]};
  head[u] = cnt;
  e[++cnt] = {u, 0, head[v]};
  head[v] = cnt;
}
int bfs() {
  for (int i = 1; i <= T; ++i) dep[i] = INF, vis[i] = 0, cur[i] = head[i];
  dep[S] = 0, Q.push(S);
  while (Q.size()) {
    int u = Q.front();
    Q.pop();
    for (int i = head[u]; i; i = e[i].next) {
      if (dep[e[i].v] > dep[u] + 1 && e[i].w) {
        dep[e[i].v] = dep[u] + 1;
        Q.push(e[i].v);
      }
    }
  }
  return dep[T] != INF;
}
int dfs(int first, int w) {
  if (first == T) return w;
  int used = 0;
  for (int i = cur[first]; i; i = e[i].next) {
    cur[first] = i;
    if (dep[e[i].v] == dep[first] + 1 && e[i].w) {
      int flow = dfs(e[i].v, min(w - used, e[i].w));
      if (flow) {
        used += flow;
        e[i].w -= flow;
        e[i ^ 1].w += flow;
        if (used == w) break;
      }
    }
  }
  return used;
}
int dinic() {
  int ans = 0;
  while (bfs()) ans += dfs(S, INF);
  return ans;
}
int main() {
  scanf("%d", &n), S = n + 1, T = S + 1;
  for (int i = 1; i <= n; ++i) {
    int k, t;
    scanf("%d", &k);
    while (k--) {
      scanf("%d", &t);
      g[i].push_back(t + n);
      g[t + n].push_back(i);
    }
  }
  for (int i = 1; i <= n; ++i) ++clk, dfs(i);
  int sum = 0;
  for (int i = 1; i <= n; ++i) {
    int t;
    scanf("%d", &t);
    t = -t;
    if (t >= 0)
      add(S, i, t), sum += t;
    else
      add(i, T, -t);
  }
  for (int i = 1; i <= n; ++i)
    for (int j : g[i]) add(i, f[j], INF);
  printf("%d\n", dinic() - sum);
}
