#include <bits/stdc++.h>
using namespace std;
long long int inf = (1 << 29);
template <class V>
class MaxFlow_dinic {
 public:
  struct edge {
    int to, reve;
    V cap;
  };
  static const int MV = 400000;
  vector<edge> E[MV];
  int itr[MV], lev[MV];
  void add_edge(int x, int y, V cap, bool undir = false) {
    E[x].push_back((edge){y, (int)E[y].size(), cap});
    E[y].push_back((edge){x, (int)E[x].size() - 1, undir ? cap : 0});
  }
  void bfs(int cur) {
    memset(lev, 0xff, sizeof(lev));
    queue<int> q;
    lev[cur] = 0;
    q.push(cur);
    while (q.size()) {
      int v = q.front();
      q.pop();
      for (__typeof(E[v].begin()) e = E[v].begin(); e != E[v].end(); e++)
        if (e->cap > 0 && lev[e->to] < 0)
          lev[e->to] = lev[v] + 1, q.push(e->to);
    }
  }
  V dfs(int from, int to, V cf) {
    if (from == to) return cf;
    for (; itr[from] < E[from].size(); itr[from]++) {
      edge* e = &E[from][itr[from]];
      if (e->cap > 0 && lev[from] < lev[e->to]) {
        V f = dfs(e->to, to, min(cf, e->cap));
        if (f > 0) {
          e->cap -= f;
          E[e->to][e->reve].cap += f;
          return f;
        }
      }
    }
    return 0;
  }
  V maxflow(int from, int to) {
    V fl = 0, tf;
    while (1) {
      bfs(from);
      if (lev[to] < 0) return fl;
      memset(itr, 0, sizeof(itr));
      while ((tf = dfs(from, to, numeric_limits<V>::max())) > 0) fl += tf;
    }
  }
};
MaxFlow_dinic<long long int> mf;
int main() {
  long long int n, i, j, Nx, y, Ny, x, sum = 0;
  cin >> n;
  Nx = n;
  Ny = n + 1;
  long long int c[n];
  for (i = 0; i < n; i++) {
    cin >> x;
    for (j = 0; j < x; j++) {
      cin >> y;
      y--;
      mf.add_edge(i, y + Nx, inf);
    }
  }
  for (i = 0; i < n; i++) {
    cin >> c[i];
    sum += c[i];
    mf.add_edge(Nx + Ny, i, inf - c[i]);
    mf.add_edge(Nx + i, Nx + Ny + 1, inf);
  }
  mf.add_edge(Nx + n, Nx + Ny + 1, inf);
  long long int ans = n * inf - (mf.maxflow(Nx + Ny, Nx + Ny + 1));
  cout << (sum - ans) << endl;
}
