#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > a[10005];
int Count = -1, H[10005], Que[10005], S, T, n;
long long F[200005], Cap[200005];
void AddEdge(int u, int v, long long w) {
  a[u].push_back(make_pair(v, ++Count));
  Cap[Count] = w;
  a[v].push_back(make_pair(u, ++Count));
  Cap[Count] = 0;
}
bool BFS() {
  int top = 0, bot = 1;
  memset(H, -1, sizeof(H));
  Que[++top] = S;
  H[S] = 0;
  while (bot <= top) {
    int u = Que[bot];
    bot++;
    for (int i = 0; i < a[u].size(); i++) {
      int v = a[u][i].first;
      int id = a[u][i].second;
      if (F[id] < Cap[id] && H[v] == -1) {
        H[v] = H[u] + 1;
        Que[++top] = v;
      }
    }
  }
  return H[T] != -1;
}
long long GetFlow(int u, long long Mi) {
  if (u == T || Mi == 0) return Mi;
  for (int i = 0; i < a[u].size(); i++) {
    int v = a[u][i].first;
    int id = a[u][i].second;
    if (H[v] != H[u] + 1) continue;
    long long Push = GetFlow(v, min(Mi, Cap[id] - F[id]));
    if (Push) {
      F[id] += Push;
      F[id ^ 1] -= Push;
      return Push;
    }
  }
  return 0;
}
long long MaxFlow() {
  long long Ans = 0;
  while (BFS())
    while (long long Push = GetFlow(S, 1e15 + 1)) Ans += Push;
  return Ans;
}
int main() {
  int Num, j, Val;
  cin >> n;
  S = 0, T = 2 * n + 1;
  for (int i = 1; i <= n; i++) {
    cin >> Num;
    while (Num--) {
      cin >> j;
      AddEdge(i, j + n, 1e15 + 1);
    }
  }
  long long Ans = 0;
  for (int i = 1; i <= n; i++) {
    cin >> Val;
    Ans += 1000000001 - Val;
    AddEdge(S, i, 1000000001 - Val);
    AddEdge(i + n, T, 1000000001);
  }
  Ans -= MaxFlow();
  cout << -Ans;
}
