#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline void upmin(T &t, T tmp) {
  if (t > tmp) t = tmp;
}
template <class T>
inline void upmax(T &t, T tmp) {
  if (t < tmp) t = tmp;
}
inline int sgn(double x) {
  if (abs(x) < 1e-9) return 0;
  return (x > 0) ? 1 : -1;
}
const double Pi = acos(-1.0);
int gint() {
  int res = 0;
  bool neg = 0;
  char z;
  for (z = getchar(); z != EOF && z != '-' && !isdigit(z); z = getchar())
    ;
  if (z == EOF) return 0;
  if (z == '-') {
    neg = 1;
    z = getchar();
  }
  for (; z != EOF && isdigit(z); res = res * 10 + z - '0', z = getchar())
    ;
  return (neg) ? -res : res;
}
long long gll() {
  long long res = 0;
  bool neg = 0;
  char z;
  for (z = getchar(); z != EOF && z != '-' && !isdigit(z); z = getchar())
    ;
  if (z == EOF) return 0;
  if (z == '-') {
    neg = 1;
    z = getchar();
  }
  for (; z != EOF && isdigit(z); res = res * 10 + z - '0', z = getchar())
    ;
  return (neg) ? -res : res;
}
const int maxn = 11000;
const int maxm = 2100;
const int inf = 0x3f3f3f3f;
int n, m, g;
int sex[maxn], v[maxn];
int app[maxm], w[maxm], k[maxm][20], fri[maxm];
int sum;
int S, T, info[maxn + maxm], now, last[maxn + maxm];
struct Tedge {
  int v, flow, next;
} edge[5000000];
void add(int u, int v, int flow) {
  edge[++now] = (Tedge){v, flow, info[u]};
  info[u] = now;
  edge[++now] = (Tedge){u, 0, info[v]};
  info[v] = now;
}
int level[maxn + maxm];
queue<int> Q;
int dinic_build() {
  int i;
  for (i = (S); i <= (T); i++) level[i] = 0;
  level[S] = 1;
  Q.push(S);
  while (!Q.empty()) {
    int u = Q.front(), v, flow;
    Q.pop();
    for (i = info[u], v = edge[i].v, flow = edge[i].flow; i != -1;
         i = edge[i].next, v = edge[i].v, flow = edge[i].flow)
      if (!level[v] && flow) level[v] = level[u] + 1, Q.push(v);
  }
  return level[T];
}
int dinic(int u, int delta) {
  if (u == T) return delta;
  int &i = last[u], v, flow, res = 0;
  for (v = edge[i].v, flow = edge[i].flow; i != -1;
       i = edge[i].next, v = edge[i].v, flow = edge[i].flow)
    if (level[u] + 1 == level[v] && flow) {
      int tmp = dinic(v, min(delta, flow));
      res += tmp;
      delta -= tmp;
      edge[i].flow -= tmp;
      edge[i ^ 1].flow += tmp;
      if (!delta) return res;
    }
  return res;
}
int main() {
  int i, j;
  n = gint();
  m = gint();
  g = gint();
  S = 0;
  T = n + m + 1;
  memset(info, -1, sizeof(info));
  now = -1;
  for (i = (1); i <= (n); i++) sex[i] = gint();
  for (i = (1); i <= (n); i++) v[i] = gint();
  for (i = (1); i <= (n); i++)
    if (!sex[i])
      add(S, i, v[i]);
    else
      add(i, T, v[i]);
  for (i = (1); i <= (m); i++) {
    app[i] = gint();
    w[i] = gint(), k[i][0] = gint();
    for (j = (1); j <= (k[i][0]); j++) k[i][j] = gint();
    fri[i] = gint();
    sum += w[i];
    if (!app[i]) {
      add(S, n + i, fri[i] ? w[i] + g : w[i]);
      for (j = (1); j <= (k[i][0]); j++) add(n + i, k[i][j], inf);
    } else {
      add(n + i, T, fri[i] ? w[i] + g : w[i]);
      for (j = (1); j <= (k[i][0]); j++) add(k[i][j], n + i, inf);
    }
  }
  int maxflow = 0;
  while (dinic_build()) {
    for (i = (S); i <= (T); i++) last[i] = info[i];
    maxflow += dinic(S, inf);
  }
  cout << sum - maxflow << endl;
  return 0;
}
