#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 22222, MAX_M = 22222 * 22;
int n, m, G;
int sex[MAX_N], v[MAX_N];
int ans;
int c[MAX_N], cc[MAX_N], g[MAX_M], nxt[MAX_M], flow[MAX_M], nm;
int S, T;
int q[MAX_N], d[MAX_N];
void addedge(int x, int y, int w) {
  g[nm] = y;
  nxt[nm] = c[x];
  c[x] = nm;
  flow[nm] = w;
  nm++;
}
void add(int x, int y, int w) {
  addedge(x, y, w);
  addedge(y, x, 0);
}
bool bfs() {
  memset(d, -1, sizeof d);
  d[q[1] = S] = 0;
  for (int l = 1, r = 1; l <= r; ++l) {
    int i = q[l];
    for (int k = c[i]; ~k; k = nxt[k]) {
      int j = g[k];
      if (!~d[j] && flow[k]) d[j] = d[i] + 1, q[++r] = j;
    }
  }
  return d[T] != -1;
}
int dfs(int i, int now) {
  if (!now) return 0;
  if (i == T) return now;
  int w = 0;
  for (int k = c[i]; ~k; k = nxt[k]) {
    int j = g[k];
    if (d[j] == d[i] + 1) {
      int res = 0;
      if (flow[k] && (res = dfs(j, min(now - w, flow[k])))) {
        flow[k] -= res;
        flow[k ^ 1] += res;
        w += res;
        if (w == now) return w;
      }
    }
  }
  return w;
}
int main() {
  nm = 0;
  memset(c, -1, sizeof c);
  scanf("%d%d%d", &n, &m, &G);
  S = n + m + 1, T = S + 1;
  for (int i = 1; i <= n; ++i) scanf("%d", &sex[i]);
  for (int i = 1; i <= n; ++i) scanf("%d", &v[i]);
  for (int i = 1; i <= n; ++i)
    if (!sex[i])
      add(S, i, v[i]);
    else
      add(i, T, v[i]);
  for (int i = 1; i <= m; ++i) {
    int e, w, k, x, e2;
    scanf("%d%d%d", &e, &w, &k);
    for (int j = 1; j <= k; ++j) {
      scanf("%d", &x);
      if (!e)
        add(i + n, x, 1000000000);
      else
        add(x, i + n, 1000000000);
    }
    scanf("%d", &e2);
    ans += w;
    w += e2 * G;
    if (!e)
      add(S, i + n, w);
    else
      add(i + n, T, w);
  }
  memcpy(cc, c, sizeof cc);
  while (bfs()) {
    ans -= dfs(S, 1000000000);
    memcpy(c, cc, sizeof c);
  }
  printf("%d\n", ans);
}
