#include <bits/stdc++.h>
using namespace std;
const long long MAX = 5e5 + 7;
const long long INF = 1e18;
struct edge {
  long long next, to;
  long long val;
} e[MAX << 1];
long long head[MAX], eid = 1;
long long cur[MAX];
void adde(long long x, long long y, long long w) {
  e[++eid].next = head[x];
  e[eid].to = y;
  e[eid].val = w;
  head[x] = eid;
}
long long dep[MAX];
long long flag = 0;
queue<long long> q;
long long S, T;
void bfs() {
  memset(dep, 0, sizeof(dep));
  dep[S] = 1;
  while (!q.empty()) {
    q.pop();
  }
  q.push(S);
  while (!q.empty()) {
    long long u = q.front();
    q.pop();
    for (long long i = head[u]; i; i = e[i].next) {
      long long v = e[i].to;
      if (e[i].val == 0 || dep[v]) {
        continue;
      }
      dep[v] = dep[u] + 1;
      q.push(v);
    }
  }
  if (dep[T]) {
    flag = 1;
  }
  memcpy(cur, head, sizeof(head));
}
long long dfs(long long u, long long in) {
  if (u == T || !in) {
    return in;
  }
  long long out = 0;
  for (long long i = cur[u]; i; i = e[i].next) {
    cur[u] = i;
    long long v = e[i].to;
    if (e[i].val == 0 || dep[v] != dep[u] + 1) {
      continue;
    }
    long long tmp = dfs(v, min(in, e[i].val));
    e[i].val -= tmp;
    e[i ^ 1].val += tmp;
    in -= tmp;
    out += tmp;
    if (in == 0) {
      return out;
    }
  }
  if (out == 0) {
    dep[u] = 0;
  }
  return out;
}
long long num[MAX];
signed main() {
  long long N, M, G;
  cin >> N >> M >> G;
  S = 0, T = N + M + 1;
  for (long long i = 1; i <= N; i++) {
    cin >> num[i];
  }
  for (long long i = 1; i <= N; i++) {
    long long w;
    cin >> w;
    if (num[i]) {
      adde(i, T, w);
      adde(T, i, 0);
    } else {
      adde(S, i, w);
      adde(i, S, 0);
    }
  }
  long long sum = 0;
  for (long long i = 1; i <= M; i++) {
    long long req, w;
    cin >> req;
    cin >> w;
    sum += w;
    long long tot;
    cin >> tot;
    for (long long j = 1; j <= tot; j++) {
      long long x;
      cin >> x;
      if (!req) {
        adde(i + N, x, INF);
        adde(x, i + N, 0);
      } else {
        adde(x, i + N, INF);
        adde(i + N, x, 0);
      }
    }
    long long pub;
    cin >> pub;
    if (!req) {
      adde(S, i + N, w + pub * G);
      adde(i + N, S, 0);
    } else {
      adde(i + N, T, w + pub * G);
      adde(T, i + N, 0);
    }
  }
  long long ans = 0;
  while (1) {
    flag = 0;
    bfs();
    if (flag == 0) {
      break;
    }
    ans += dfs(S, INF);
  }
  cout << sum - ans << endl;
}
