#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10, maxm = 2010, inf = 0x7fffffff / 2;
namespace Dinic {
const int N = maxn + maxm, M = maxn + maxm * 20, inf = 0x7fffffff / 2;
int s, t, maxflow, stop;
int head[N], head2[N], next[M * 2], to[M * 2], f[M * 2], op;
int dis[N], que[N], way[N];
void init(int _s, int _t) {
  op = 1;
  memset(head, 0, sizeof(head));
  stop = 0;
  s = _s;
  t = _t;
}
void build(int a, int b, int c) {
  next[++op] = head[a];
  head[a] = op;
  to[op] = b;
  f[op] = c;
  next[++op] = head[b];
  head[b] = op;
  to[op] = a;
  f[op] = 0;
}
bool spfa() {
  memset(dis, 0, sizeof(dis));
  dis[t] = inf;
  int start, tail;
  que[start = tail = 1] = t;
  while (start <= tail) {
    int u = que[start++];
    for (int pos = head[u]; pos; pos = next[pos])
      if (f[pos ^ 1] && !dis[to[pos]]) {
        dis[to[pos]] = dis[u] - 1;
        que[++tail] = to[pos];
      }
  }
  memcpy(head2, head, sizeof(head));
  return dis[s];
}
bool dinic(int s, int top) {
  if (s == t) {
    int minflow = inf;
    for (int pos = 1; pos < top; pos++)
      if (minflow > f[way[pos]]) {
        minflow = f[way[pos]];
        stop = pos;
      }
    maxflow += minflow;
    for (int pos = 1; pos < top; pos++) {
      f[way[pos]] -= minflow;
      f[way[pos] ^ 1] += minflow;
    }
    return true;
  }
  for (int& pos = head2[s]; pos; pos = next[pos])
    if (f[pos] && dis[to[pos]] == dis[s] + 1) {
      way[top] = pos;
      if (dinic(to[pos], top + 1) && top != stop) return true;
    }
  return false;
}
int findmaxflow() {
  maxflow = 0;
  while (spfa()) dinic(s, 1);
  return maxflow;
}
}  // namespace Dinic
int n, m, g;
int sex[maxn];
int ans;
int S, T;
int main() {
  scanf("%d%d%d", &n, &m, &g);
  S = n + m + 1;
  T = S + 1;
  Dinic::init(S, T);
  for (int i = 1; i <= n; i++) scanf("%d", &sex[i]);
  for (int i = 1, v; i <= n; i++) {
    scanf("%d", &v);
    if (sex[i])
      Dinic::build(S, i, v);
    else
      Dinic::build(i, T, v);
  }
  for (int i = 1; i <= m; i++) {
    int s, w, k, f;
    scanf("%d%d%d", &s, &w, &k);
    for (int j = 1, index; j <= k; j++) {
      scanf("%d", &index);
      if (s)
        Dinic::build(i + n, index, inf);
      else
        Dinic::build(index, i + n, inf);
    }
    scanf("%d", &f);
    ans += w;
    w += f * g;
    if (s)
      Dinic::build(S, i + n, w);
    else
      Dinic::build(i + n, T, w);
  }
  ans -= Dinic::findmaxflow();
  cout << ans << endl;
  return 0;
}
