#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f;
long long ec = 1, to[128005], nxt[128005], cap[128005], hed[24005];
void add_edge(long long f, long long t, long long c) {
  ++ec;
  to[ec] = t;
  nxt[ec] = hed[f];
  hed[f] = ec;
  cap[ec] = c;
  ++ec;
  to[ec] = f;
  nxt[ec] = hed[t];
  hed[t] = ec;
  cap[ec] = 0;
}
queue<long long> q;
long long lev[24005];
long long cur[24005];
void bfs(long long s) {
  while (!q.empty()) q.pop();
  memset(lev, -1, sizeof(lev));
  q.push(s);
  lev[s] = 1;
  while (!q.empty()) {
    long long u = q.front();
    q.pop();
    for (long long i = hed[u]; i; i = nxt[i]) {
      long long v = to[i];
      if (cap[i] && lev[v] == -1) {
        lev[v] = lev[u] + 1;
        q.push(v);
      }
    }
  }
}
long long dfs(long long u, long long t, long long f) {
  if (u == t) return f;
  for (long long i = cur[u]; i; i = nxt[i]) {
    cur[u] = i;
    long long v = to[i];
    if (cap[i] && lev[v] == lev[u] + 1) {
      long long tmp = dfs(v, t, min(f, cap[i]));
      if (tmp) {
        cap[i] -= tmp;
        cap[i ^ 1] += tmp;
        return tmp;
      }
    }
  }
  return 0;
}
long long mxf = 0;
void dinic(long long s, long long t) {
  long long df = 0;
  while (1) {
    bfs(s);
    if (lev[t] == -1) break;
    for (long long i = 1; i <= t; i++) cur[i] = hed[i];
    while (1) {
      df = dfs(s, t, INF);
      mxf += df;
      if (!df) break;
    }
  }
}
long long n, m, g, u, v, k, ans = 0, S, T;
long long a[20005], w[20005];
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> g;
  S = n + m + 1;
  T = S + 1;
  for (long long i = 1; i <= n; i++) cin >> a[i];
  for (long long i = 1; i <= n; i++) {
    cin >> w[i];
    if (a[i] == 0) add_edge(S, i, w[i]);
    if (a[i] == 1) add_edge(i, T, w[i]);
  }
  for (long long i = 1; i <= m; i++) {
    cin >> u >> v >> k;
    if (u == 0) add_edge(S, i + n, v);
    if (u == 1) add_edge(i + n, T, v);
    ans += v;
    for (long long j = 1; j <= k; j++) {
      cin >> a[j];
      if (u == 0) add_edge(i + n, a[j], INF);
      if (u == 1) add_edge(a[j], i + n, INF);
    }
    cin >> k;
    if (k) {
      if (u == 0) add_edge(S, i + n, g);
      if (u == 1) add_edge(i + n, T, g);
    }
  }
  dinic(S, T);
  cout << ans - mxf << '\n';
  return 0;
}
