#include <bits/stdc++.h>
using namespace std;
const int MAXN = 12005, eMAXN = 200005;
struct edge {
  int to, nxt;
  int val;
} e[eMAXN];
int cnt = 1, head[MAXN], cur[MAXN];
void add(int u, int v, int w) {
  e[++cnt].to = v;
  e[cnt].nxt = head[u];
  e[cnt].val = w;
  head[u] = cnt;
}
void addedge(int u, int v, int w) {
  add(u, v, w);
  add(v, u, 0);
}
int deep[MAXN], Queue[MAXN];
bool bfs(int s, int t) {
  memcpy(cur, head, sizeof head);
  memset(deep, 0, sizeof deep);
  int l = 1, r = 1;
  Queue[1] = s;
  deep[s] = 1;
  while (l <= r) {
    int u = Queue[l++];
    for (int p = head[u]; p; p = e[p].nxt) {
      int v = e[p].to;
      if (e[p].val != 0 && deep[v] == 0) {
        deep[v] = deep[u] + 1;
        Queue[++r] = v;
      }
    }
  }
  return deep[t];
}
int dfs(int u, int t, int in) {
  if (u == t) return in;
  int out = 0;
  for (int p = cur[u]; p; p = e[p].nxt) {
    cur[u] = p;
    int v = e[p].to;
    if (e[p].val != 0 && deep[v] == deep[u] + 1) {
      int mnin = e[p].val;
      if (in < mnin) mnin = in;
      int res = dfs(v, t, mnin);
      if (in == 0) return out;
      e[p].val -= res;
      e[p ^ 1].val += res;
      in -= res;
      out += res;
    }
  }
  if (out == 0) deep[u] = 0;
  return out;
}
void init() {
  for (int i = 1; i <= cnt; i++) {
    e[i].to = 0;
    e[i].nxt = 0;
    e[i].val = 0;
  }
  cnt = 1;
  memset(head, 0, sizeof head);
  memset(cur, 0, sizeof cur);
  memset(Queue, 0, sizeof Queue);
}
int one[10005], V[10005];
int main() {
  int n, m, g, s, t;
  scanf("%d%d%d", &n, &m, &g);
  s = 12001, t = 12002;
  for (int i = 1; i <= n; i++) scanf("%d", &one[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &V[i]);
  for (int i = 1; i <= n; i++) {
    if (one[i] == 1)
      addedge(s, i, V[i]);
    else
      addedge(i, t, V[i]);
  }
  int tot = 0;
  for (int i = 1; i <= m; i++) {
    int z, mi, w, ai, z2;
    scanf("%d%d%d", &z, &w, &mi);
    for (int j = 1; j <= mi; j++) {
      scanf("%d", &ai);
      if (z == 1)
        addedge(i + n, ai, 2e9);
      else
        addedge(ai, i + n, 2e9);
    }
    scanf("%d", &z2);
    tot += w;
    if (z2 == 1) w += g;
    if (z == 1)
      addedge(s, i + n, w);
    else
      addedge(i + n, t, w);
  }
  int ans = 0;
  while (bfs(s, t)) {
    int d;
    while (d = dfs(s, t, 2e9)) ans += d;
  }
  printf("%d\n", tot - ans);
  return 0;
}
