#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e16;
const int N = 1e6 + 5;
const int M = 2e6 + 5;
inline void read(int &x) {
  x = 0;
  char c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
  }
}
struct Edge {
  int to, cap, nxt;
} E[M];
int n, m, g, cnt, head[N], A[N], cur[N], d[N], s, t, tot;
long long ans;
void addedg(int u, int v, int w) {
  E[++cnt] = (Edge){v, w, head[u]};
  head[u] = cnt;
}
bool bfs(int s, int t) {
  for (int i = s; i <= tot; i++) d[i] = -1;
  d[s] = 0;
  queue<int> q;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = E[i].nxt) {
      int v = E[i].to;
      if (E[i].cap && d[v] == -1) {
        d[v] = d[u] + 1;
        q.push(v);
      }
    }
  }
  return d[t] != -1;
}
long long dfs(int t, int u, long long flow) {
  if (u == t) return flow;
  long long res = 0;
  for (int i = cur[u]; i; i = E[i].nxt) {
    int v = E[i].to;
    cur[u] = i;
    if (E[i].cap && d[v] == d[u] + 1) {
      long long p = dfs(t, v, min(flow, (long long)E[i].cap));
      E[i].cap -= p;
      E[i ^ 1].cap += p;
      res += p;
      flow -= p;
      if (!flow) break;
    }
  }
  return res;
}
long long dinic(int s, int t) {
  long long res = 0;
  while (bfs(s, t)) {
    memcpy(cur, head, sizeof(cur));
    res += dfs(t, s, inf);
  }
  return res;
}
int main() {
  read(n);
  read(m);
  read(g);
  cnt = 1;
  s = 0;
  tot = t = n + 1;
  for (int i = 1; i <= n; i++) read(A[i]);
  for (int i = 1; i <= n; i++) {
    int v;
    read(v);
    if (A[i])
      addedg(i, t, v), addedg(t, i, 0);
    else
      addedg(s, i, v), addedg(i, s, 0);
  }
  for (int i = 1; i <= m; i++) {
    int a, b, c, k;
    read(a);
    read(c);
    read(k);
    ++tot;
    ans += c;
    for (int j = 1; j <= k; j++) {
      read(b);
      if (a)
        addedg(b, tot, inf), addedg(tot, b, 0);
      else
        addedg(tot, b, inf), addedg(b, tot, 0);
    }
    read(b);
    if (b) c += g;
    if (a)
      addedg(tot, t, c), addedg(t, tot, 0);
    else
      addedg(s, tot, c), addedg(tot, s, 0);
  }
  printf("%lld", ans - dinic(s, t));
  return 0;
}
