#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x7f7f7f7f;
struct Edge {
  int to, nxt, val;
} e[N << 1];
int h[N], idx = 1;
void Ins(int a, int b, int c) {
  e[++idx].to = b;
  e[idx].nxt = h[a];
  e[idx].val = c;
  h[a] = idx;
}
int st, ed, a[N], d[N], now[N], q[N], hh, tt;
bool bfs() {
  memset(d, -1, sizeof(d));
  hh = 0;
  tt = -1;
  q[++tt] = st;
  d[st] = 1;
  now[st] = h[st];
  while (hh <= tt) {
    int u = q[hh++];
    for (int i = h[u]; i; i = e[i].nxt) {
      int v = e[i].to;
      if (d[v] == -1 && e[i].val) {
        d[v] = d[u] + 1;
        q[++tt] = v;
        now[v] = h[v];
        if (v == ed) return 1;
      }
    }
  }
  return 0;
}
int dinic(int u, int f) {
  if (u == ed) return f;
  int re = f;
  for (int i = now[u]; i && re; i = e[i].nxt) {
    now[u] = i;
    int v = e[i].to;
    if (d[v] == d[u] + 1 && e[i].val) {
      int k = dinic(v, min(e[i].val, re));
      if (!k) d[v] = -1;
      e[i].val -= k;
      re -= k;
      e[i ^ 1].val += k;
    }
  }
  return f - re;
}
int main() {
  int n, m, g;
  scanf("%d%d%d", &n, &m, &g);
  int cnt = n;
  st = ++cnt;
  ed = ++cnt;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= n; i++) {
    int v;
    scanf("%d", &v);
    if (a[i])
      Ins(st, i, v), Ins(i, st, 0);
    else
      Ins(i, ed, v), Ins(ed, i, 0);
  }
  int res = 0;
  for (int i = 1; i <= m; i++) {
    int t, w, k, x;
    scanf("%d%d%d", &t, &w, &k);
    ++cnt;
    res += w;
    while (k--) {
      scanf("%d", &x);
      if (t) {
        Ins(cnt, x, INF);
        Ins(x, cnt, 0);
      } else {
        Ins(x, cnt, INF);
        Ins(cnt, x, 0);
      }
    }
    scanf("%d", &x);
    if (x) w += g;
    if (t)
      Ins(st, cnt, w), Ins(cnt, st, 0);
    else
      Ins(cnt, ed, w), Ins(ed, cnt, 0);
  }
  while (bfs()) res -= dinic(st, INF);
  printf("%d\n", res);
  return 0;
}
