#include <bits/stdc++.h>
using namespace std;
int cap[666666];
int head[44444], dst[44444], nxt[666666], to[666666], work[44444];
int tp[44444], adj[44444][11], val[44444], w[44444], deg[44444];
int src, tar, E, V;
int qf, qb, q[44444];
void init(int n, int s, int t) {
  memset(head, -1, sizeof(int) * n);
  V = n;
  E = 0;
  src = s;
  tar = t;
}
void add_edge(int u, int v, int c) {
  to[E] = v;
  cap[E] = c;
  nxt[E] = head[u];
  head[u] = E++;
  to[E] = u;
  cap[E] = 0;
  nxt[E] = head[v];
  head[v] = E++;
}
int bfs() {
  memset(dst, -1, sizeof(dst));
  qf = qb = 0;
  dst[src] = 0;
  q[qb++] = src;
  while (qf < qb) {
    int u = q[qf++];
    for (int e = head[u]; e != -1; e = nxt[e]) {
      if (cap[e] < 1) continue;
      int v = to[e];
      if (dst[v] != -1) continue;
      dst[v] = dst[u] + 1;
      q[qb++] = v;
    }
  }
  return dst[tar] >= 0;
}
int dfs(int u, int &bot) {
  if (u == tar) return bot;
  int bot1, delta, v;
  for (int &e = work[u]; e != -1; e = nxt[e]) {
    v = to[e];
    if (cap[e] < 1) continue;
    if (dst[v] != dst[u] + 1) continue;
    bot1 = min(cap[e], bot);
    if (delta = dfs(v, bot1)) {
      cap[e] -= delta;
      cap[e ^ 1] += delta;
      return delta;
    }
  }
  return 0;
}
int dinic() {
  int ans = 0, bot, delta;
  while (bfs()) {
    memcpy(work, head, sizeof(int) * V);
    while (delta = dfs(src, bot = 100000000000000LL)) ans += delta;
  }
  return ans;
}
int main() {
  int N, M, g, wei, f, i, j;
  scanf("%d%d%d", &N, &M, &g);
  src = N + M;
  tar = src + 1;
  init(tar + 1, src, tar);
  for (i = 0; i < N; i++) scanf("%d", tp + i);
  for (i = 0; i < N; i++) {
    scanf("%d", val + i);
    if (tp[i] == 0)
      add_edge(src, i, val[i]);
    else
      add_edge(i, tar, val[i]);
  }
  int tot = 0;
  for (i = 0; i < M; i++) {
    scanf("%d%d%d", w + i, &wei, deg + i);
    for (j = 0; j < deg[i]; j++) {
      scanf("%d", &adj[i][j]);
      adj[i][j]--;
      if (tp[adj[i][j]] != w[i]) {
        if (w[i] == 0)
          add_edge(i + N, adj[i][j], 100000000000000LL);
        else
          add_edge(adj[i][j], i + N, 100000000000000LL);
      }
    }
    scanf("%d", &f);
    tot += wei;
    if (f) wei += g;
    if (w[i] == 0)
      add_edge(src, i + N, wei);
    else
      add_edge(i + N, tar, wei);
  }
  for (i = 0; i < M; i++)
    for (j = 0; j < M; j++) {
      if (w[i]) continue;
      if (w[j] == 0) continue;
      int ok = 0;
      for (int ii = 0; ii < deg[i]; ii++)
        for (int jj = 0; jj < deg[j]; jj++) {
          if (adj[i][ii] == adj[j][jj]) ok = 1;
        }
      if (ok) add_edge(i + N, j + N, 100000000000000LL);
    }
  printf("%d\n", tot - dinic());
  return 0;
}
