#include <bits/stdc++.h>
int lst[305], to[100005], pre[100005], cap[100005], tot;
int fst[305], que[305], dep[305], from[305];
bool vis[305];
std::vector<int> vec[305];
inline void add_edge(int u, int v) {
  to[tot] = v;
  pre[tot] = lst[u];
  lst[u] = tot++;
}
inline void add_edge(int u, int v, int _cap) {
  cap[tot] = _cap;
  add_edge(u, v);
  add_edge(v, u);
}
bool dfs(int u) {
  for (int i = lst[u]; ~i; i = pre[i]) {
    if (vis[to[i]]) continue;
    vis[to[i]] = true;
    if (-1 == from[to[i]] || dfs(from[to[i]])) {
      from[to[i]] = u;
      return true;
    }
  }
  return false;
}
inline void hungary(int n) {
  memset(from, -1, sizeof(from));
  for (int i = 0; i < n; i++) {
    memset(vis, false, sizeof(vis));
    dfs(i);
  }
}
inline bool bfs(int s, int t) {
  int he = 0, ta = 0;
  que[ta++] = s;
  memset(dep, -1, sizeof(dep));
  dep[s] = 0;
  while (he < ta) {
    int u = que[he++];
    for (int i = lst[u]; ~i; i = pre[i]) {
      if (-1 == dep[to[i]] && cap[i]) {
        dep[to[i]] = dep[u] + 1;
        que[ta++] = to[i];
      }
    }
  }
  return ~dep[t];
}
int dfs(int u, int t, int rem) {
  if (u == t) return rem;
  int ans = 0;
  for (int i = fst[u]; ~i; i = pre[i]) {
    if (dep[to[i]] != dep[u] + 1 || !cap[i]) continue;
    int res = dfs(to[i], t, std::min(rem - ans, cap[i]));
    cap[i] -= res;
    cap[i ^ 1] += res;
    if (cap[i]) fst[u] = i;
    ans += res;
    if (ans == rem) return ans;
  }
  if (!ans) dep[u] = -1;
  return ans;
}
inline int dinic(int s, int t) {
  int ans = 0;
  while (bfs(s, t)) {
    memcpy(fst, lst, sizeof(lst));
    ans += dfs(s, t, 1e9);
  }
  return ans;
}
int main() {
  memset(lst, -1, sizeof(lst));
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int len;
    scanf("%d", &len);
    for (int j = 0; j < len; j++) {
      int x;
      scanf("%d", &x);
      add_edge(i, --x);
      vec[i].push_back(x);
    }
  }
  hungary(n);
  memset(lst, -1, sizeof(lst));
  tot = 0;
  for (int i = 0; i < n; i++) {
    for (int x : vec[i]) add_edge(i + 1, from[x] + 1, 1e9);
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    if (x < 0) {
      add_edge(0, i + 1, -x);
      ans += x;
    } else
      add_edge(i + 1, n + 1, x);
  }
  printf("%d\n", ans + dinic(0, n + 1));
  return 0;
}
