#include <bits/stdc++.h>
using namespace std;
const long long INFe = 301 * 1000000LL;
const long long INF = 90000000000LL;
long long f[602][602];
long long c[602][602];
int h[602];
int ind[602];
long long e[602];
int n;
int s, t;
void Push(int v, int u) {
  long long add = min(e[v], c[v][u] - f[v][u]);
  e[v] -= add;
  e[u] += add;
  f[v][u] += add;
  f[u][v] -= add;
}
void Lift(int v) {
  int m = n + 2;
  for (int u = 0; u < n; ++u) {
    if (c[v][u] - f[v][u] > 0) m = min(m, h[u]);
  }
  h[v] = m + 1;
}
void Discharge(int v) {
  while (e[v] > 0) {
    if (ind[v] >= n) {
      Lift(v);
      ind[v] = 0;
    } else {
      int u = ind[v];
      if (h[u] == h[v] - 1 && c[v][u] - f[v][u] > 0) Push(v, u);
      ++ind[v];
    }
  }
}
void MaxFlow() {
  list<int> L;
  h[t] = 0;
  h[s] = n;
  for (int v = 0; v < n; ++v) {
    f[s][v] = c[s][v];
    f[v][s] = -f[s][v];
    e[v] += c[s][v];
  }
  for (int v = 0; v < n; ++v) {
    if (v != s && v != t) L.push_back(v);
  }
  list<int>::iterator it = L.begin();
  while (it != L.end()) {
    int u = *it;
    int cur_h = h[u];
    Discharge(u);
    if (h[u] > cur_h) {
      L.erase(it);
      L.push_front(u);
      it = L.begin();
    }
    ++it;
  }
}
int main() {
  int vn;
  scanf("%d", &vn);
  n = vn + vn + 2;
  s = n - 2;
  t = n - 1;
  for (int i = 0; i < vn; ++i) {
    int m;
    scanf("%d", &m);
    for (int j = 0; j < m; ++j) {
      int v;
      scanf("%d", &v);
      --v;
      c[i][v + vn] = INF;
    }
  }
  long long res = 0;
  for (int i = 0; i < vn; ++i) {
    int w;
    scanf("%d", &w);
    c[s][i] = INFe - w;
    c[vn + i][t] = INFe;
    res -= c[s][i];
  }
  MaxFlow();
  for (int i = 0; i < vn; ++i) res += f[s][i];
  cout << res;
  return 0;
};
