#include <bits/stdc++.h>
using namespace std;
struct po {
  int to, next, w;
} e[4000005];
int n, m, st, en, a, b, c, d, cnt = 1, cur[4000005], head[4000005],
                              deep[4000005];
int xb[10005], sr[10005], g, ans = 0;
void add(int x, int y, int z) {
  e[++cnt].to = y, e[cnt].w = z, e[cnt].next = head[x], head[x] = cnt;
  e[++cnt].to = x, e[cnt].w = 0, e[cnt].next = head[y], head[y] = cnt;
}
bool bfs() {
  queue<int> q;
  while (!q.empty()) q.pop();
  memset(deep, -1, sizeof(deep));
  deep[st] = 0, q.push(st);
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    for (int i = head[now]; i; i = e[i].next)
      if (deep[e[i].to] == -1 && e[i].w)
        deep[e[i].to] = deep[now] + 1, q.push(e[i].to);
  }
  return (deep[en] != -1);
}
long long dfs(int x, long long w) {
  if (x == en || !w) return w;
  long long pro, flow = 0;
  for (int &i = cur[x]; i && flow < w; i = e[i].next)
    if (deep[e[i].to] == deep[x] + 1 && e[i].w) {
      if ((pro = dfs(e[i].to, min(w - flow, (long long)e[i].w))) > 0)
        flow += pro, e[i].w -= pro, e[i ^ 1].w += pro;
      if (flow == w) break;
    }
  if (!flow) deep[x] = -1;
  return flow;
}
int main() {
  scanf("%d%d%d", &n, &m, &g), st = 0, en = n * 2 + m * 2 + 1;
  for (int i = 1; i <= n; i++) scanf("%d", &xb[i]);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a);
    if (xb[i])
      add(i, en, a);
    else
      add(st, i, a);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &a, &b, &c), ans += b;
    for (int j = 1; j <= c; j++) scanf("%d", &sr[j]);
    scanf("%d", &d);
    for (int j = 1; j <= c; j++) {
      if (a)
        add(sr[j], n + i, 0x3f3f3f3f);
      else
        add(i + n, sr[j], 0x3f3f3f3f);
    }
    if (a)
      add(n + i, en, b + d * g);
    else
      add(st, i + n, b + d * g);
  }
  int pro;
  while (bfs()) {
    memcpy(cur, head, sizeof(head));
    while ((pro = dfs(st, 0x3f3f3f3f)) > 0) ans -= pro;
  }
  printf("%d", ans);
  return 0;
}
