#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e5 + 5;
const long long maxm = 2e5 + 5;
long long n, m, s, t, tot = 1, ans, lev[maxn], head[maxn];
struct node {
  long long to, z, nxt;
} e[maxm << 1];
void add(long long x, long long y, long long z) {
  e[++tot] = {y, z, head[x]};
  head[x] = tot;
  e[++tot] = {x, 0, head[y]};
  head[y] = tot;
}
bool bfs() {
  bool sign = 0;
  memset(lev, 0, sizeof(lev));
  queue<long long> q;
  lev[s] = 1;
  q.push(s);
  while (q.size()) {
    long long x = q.front();
    q.pop();
    for (long long i = head[x]; i; i = e[i].nxt) {
      long long y = e[i].to, z = e[i].z;
      if (z == 0 || lev[y]) continue;
      lev[y] = lev[x] + 1, q.push(y);
      if (y == t) return 1;
    }
  }
  return 0;
}
long long dinic(long long x, long long flow) {
  if (x == t) return flow;
  long long res = flow, inc;
  for (long long i = head[x]; i && res; i = e[i].nxt) {
    long long y = e[i].to, z = e[i].z;
    if (z && lev[y] == lev[x] + 1) {
      inc = dinic(y, min(res, z));
      if (inc == 0) lev[y] = 0;
      e[i].z -= inc, e[i ^ 1].z += inc;
      res -= inc;
    }
  }
  return flow - res;
}
long long g, a[maxm], v[maxn];
signed main() {
  s = 0, t = maxn - 5;
  scanf("%lld%lld%lld", &n, &m, &g);
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (long long i = 1, x; i <= n; i++) {
    scanf("%lld", &x);
    if (a[i])
      add(s, i, x);
    else
      add(i, t, x);
  }
  long long sum = 0;
  for (long long i = 1, op, k, neg, x, y, z; i <= m; i++) {
    scanf("%lld%lld%lld", &op, &z, &k);
    sum += z;
    for (long long j = 1; j <= k; j++) {
      scanf("%lld", &x);
      if (op)
        add(n + i, x, 1e17);
      else
        add(x, n + i, 1e17);
    }
    scanf("%lld", &neg);
    if (op)
      add(s, n + i, z + g * neg);
    else
      add(n + i, t, z + g * neg);
  }
  long long res = 0;
  while (bfs()) {
    res = dinic(s, 1e17);
    while (res) {
      ans += res;
      res = dinic(s, 1e17);
    }
  }
  cout << sum - ans << "\n";
  return 0;
}
