#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10003;
const int MAXM = 2003;
const int INF = 0x3f3f3f3f;
int n, m, g;
const int MAXV = MAXN + MAXM + 2;
const int MAXE = MAXN + MAXM + MAXM * 10;
struct Edge {
  Edge* next;
  int dest, cap;
};
int S, T;
Edge memory[MAXE * 2];
Edge* info[MAXV];
Edge* curMemory = memory;
void insert(int u, int v, int c) {
  curMemory->next = info[u];
  curMemory->dest = v;
  curMemory->cap = c;
  info[u] = curMemory++;
  curMemory->next = info[v];
  curMemory->dest = u;
  curMemory->cap = 0;
  info[v] = curMemory++;
}
Edge* oppositeEdge(const Edge* const x) { return memory + ((x - memory) ^ 1); }
int lev[MAXV];
bool bfs() {
  queue<int> que;
  fill(lev, lev + m + n + 2, -1);
  que.push(S);
  lev[S] = 0;
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (Edge* pt = info[u]; pt; pt = pt->next) {
      int v = pt->dest;
      if (lev[v] == -1 && pt->cap) {
        que.push(v);
        lev[v] = lev[u] + 1;
      }
    }
  }
  return lev[T] != -1;
}
Edge* pre[MAXV];
int dfs(int u, int flow) {
  if (u == T) return flow;
  int rest = flow;
  for (Edge*& pt = pre[u]; pt; pt = pt->next) {
    int v = pt->dest;
    if (pt->cap && lev[u] + 1 == lev[v]) {
      int temp = dfs(v, min(pt->cap, rest));
      if (temp) {
        rest -= temp;
        pt->cap -= temp;
        oppositeEdge(pt)->cap += temp;
        if (!rest) return flow;
      }
    }
  }
  return flow - rest;
}
int main() {
  scanf("%d%d%d", &n, &m, &g);
  S = 0, T = n + m + 1;
  static int gender[MAXN];
  for (int i = 1; i <= n; i++) scanf("%d", gender + i);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    if (gender[i])
      insert(i, T, x);
    else
      insert(S, i, x);
  }
  int ans = 0;
  for (int i = 1; i <= m; i++) {
    int t, w, k, f;
    int a[10];
    scanf("%d%d%d", &t, &w, &k);
    for (int j = 0; j < k; j++) scanf("%d", a + j);
    scanf("%d", &f);
    ans += w;
    if (f) w += g;
    if (t) {
      insert(i + n, T, w);
      for (int j = 0; j < k; j++) insert(a[j], i + n, INF);
    } else {
      insert(S, i + n, w);
      for (int j = 0; j < k; j++) insert(i + n, a[j], INF);
    }
  }
  while (bfs()) {
    copy(info, info + n + m + 2, pre);
    ans -= dfs(S, INF);
  }
  printf("%d\n", ans);
  return 0;
}
