#include <bits/stdc++.h>
using namespace std;
int point[500000], nxt[500000], v[500000], remain[500000], tot, a[500000],
    val[500000];
int last[500000], deep[500000], num[500000], cur[500000], n, m, g;
void add(int x, int y, int z) {
  tot++;
  nxt[tot] = point[x];
  point[x] = tot;
  v[tot] = y;
  remain[tot] = z;
  tot++;
  nxt[tot] = point[y];
  point[y] = tot;
  v[tot] = x;
  remain[tot] = 0;
}
int addflow(int s, int t) {
  int ans = 100000000;
  int now = t;
  while (now != s) {
    ans = min(ans, remain[last[now]]);
    now = v[last[now] ^ 1];
  }
  now = t;
  while (now != s) {
    remain[last[now]] -= ans;
    remain[last[now] ^ 1] += ans;
    now = v[last[now] ^ 1];
  }
  return ans;
}
void bfs(int s, int t) {
  for (int i = 1; i <= t; i++) deep[i] = t;
  queue<int> p;
  p.push(t);
  deep[t] = 0;
  while (!p.empty()) {
    int now = p.front();
    p.pop();
    for (int i = point[now]; i != -1; i = nxt[i])
      if (deep[v[i]] == t && remain[i ^ 1]) {
        deep[v[i]] = deep[now] + 1;
        p.push(v[i]);
      }
  }
}
int isap(int s, int t) {
  int ans = 0;
  int now = s;
  bfs(s, t);
  for (int i = 1; i <= t; i++) num[deep[i]]++;
  for (int i = 1; i <= t; i++) cur[i] = point[i];
  while (deep[s] < t) {
    if (now == t) {
      ans += addflow(s, t);
      now = s;
    }
    bool pd = false;
    for (int i = point[now]; i != -1; i = nxt[i])
      if (deep[v[i]] + 1 == deep[now] && remain[i]) {
        pd = true;
        cur[now] = i;
        last[v[i]] = i;
        now = v[i];
        break;
      }
    if (!pd) {
      int minn = t + 1;
      for (int i = point[now]; i != -1; i = nxt[i])
        if (remain[i]) minn = min(minn, deep[v[i]]);
      if (!--num[deep[now]]) break;
      num[deep[now] = minn + 1]++;
      cur[now] = point[now];
      if (now != s) now = v[last[now] ^ 1];
    }
  }
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &g);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
  int S = n + m + 1;
  int T = S + 1;
  int sum = 0;
  tot = -1;
  memset(point, -1, sizeof(point));
  for (int i = 1; i <= n; i++)
    if (a[i])
      add(i, T, val[i]);
    else
      add(S, i, val[i]);
  for (int i = 1; i <= m; i++) {
    int opt, w, k;
    scanf("%d%d%d", &opt, &w, &k);
    sum += w;
    for (int j = 1; j <= k; j++) {
      int x;
      scanf("%d", &x);
      if (opt)
        add(x, i + n, 100000000);
      else
        add(i + n, x, 100000000);
    }
    int mark;
    scanf("%d", &mark);
    if (mark) w += g;
    if (opt)
      add(i + n, T, w);
    else
      add(S, i + n, w);
  }
  printf("%d\n", sum - isap(S, T));
}
