#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T &n) {
  n = 0;
  T f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (isdigit(c)) n = n * 10 + c - '0', c = getchar();
  n *= f;
}
template <typename T>
void write(T n) {
  if (n < 0) putchar('-'), n = -n;
  if (n > 9) write(n / 10);
  putchar(n % 10 + '0');
}
int n, m, cnt = 1, tot, s, t;
int head[500005], vet[500005], Next[500005];
long long cost[500005], g;
void adde(int x, int y, long long w) {
  cnt++;
  Next[cnt] = head[x];
  head[x] = cnt;
  vet[cnt] = y;
  cost[cnt] = w;
}
void add(int x, int y, long long w) { adde(x, y, w), adde(y, x, 0); }
int dis[500005], vis[500005], cur[500005];
bool bfs() {
  for (int i = 0; i <= t; i++) {
    dis[i] = 0x3f3f3f3f, vis[i] = 0, cur[i] = head[i];
  }
  queue<int> q;
  dis[s] = 0, vis[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = head[x]; i; i = Next[i]) {
      int v = vet[i];
      if (vis[v] || !cost[i]) continue;
      dis[v] = dis[x] + 1;
      vis[v] = 1;
      q.push(v);
    }
  }
  return dis[t] < 0x3f3f3f3f;
}
long long ans = 0, all;
long long dfs(int x, long long flow) {
  if (x == t) {
    ans += flow;
    return flow;
  }
  long long used = 0;
  for (int i = cur[x]; i; i = Next[i]) {
    int v = vet[i];
    if (cost[i] && dis[v] == dis[x] + 1) {
      long long m = dfs(v, min(flow - used, cost[i]));
      cost[i] -= m, cost[i ^ 1] += m, used += m;
      if (used == flow) break;
    }
  }
  return used;
}
void dinic() {
  ans = 0;
  while (bfs()) dfs(s, 0x3f3f3f3f);
}
int a[500005], v[500005];
int main() {
  cin >> n >> m >> g;
  s = 0, t = n + m + 5, tot = n;
  for (int i = 1; i <= n; i++) read(a[i]);
  for (int i = 1; i <= n; i++) read(v[i]);
  for (int i = 1; i <= n; i++) {
    if (!a[i])
      add(s, i, v[i]);
    else
      add(i, t, v[i]);
  }
  int op, x, k, w, tar;
  for (int i = 1; i <= m; i++) {
    read(tar), read(w), read(k);
    all += w;
    tot++;
    for (int j = 1; j <= k; j++) {
      read(x);
      if (!tar)
        add(tot, x, 0x3f3f3f3f);
      else
        add(x, tot, 0x3f3f3f3f);
    }
    read(op);
    if (!tar)
      add(s, tot, g * op + w);
    else
      add(tot, t, g * op + w);
  }
  dinic();
  cout << all - ans << endl;
  return 0;
}
