#include <bits/stdc++.h>
using namespace std;
int maxint = ~0U >> 1;
int flow, cost;
int pi[200001 + 1], v[200001 + 1];
int S, T;
int INF = 1000000000;
int tempAdd = 100000;
struct etype {
  int t, c;
  etype* next;
  etype* pair;
  etype() { next = 0; }
  etype(int _t, int _c, etype* _n) { t = _t, c = _c, next = _n; }
} * e[200001 + 1], *eb[200001 + 1], *Pe, *Pool;
int aug(int w, int lim) {
  int t;
  v[w] = 1;
  if (w == T) {
    flow += lim;
    return lim;
  }
  for (etype*& i = e[w]; i; i = i->next)
    if (i->c && !v[i->t] && pi[w] == pi[i->t] + 1)
      if (t = aug(i->t, min(lim, i->c))) return i->c -= t, i->pair->c += t, t;
  return 0;
}
bool fix() {
  int t = maxint;
  for (int i = S; i <= T; i++)
    if (v[i]) {
      for (etype* j = eb[i]; j; j = j->next)
        if (j->c && !v[j->t]) t = min(t, pi[j->t] + 1 - pi[i]);
    }
  if (t == maxint) return 0;
  for (int i = S; i <= T; i++)
    if (v[i]) e[i] = eb[i], pi[i] += t;
  return 1;
}
void addedge(int s, int t, int c) {
  ++Pe;
  Pe->t = t, Pe->c = c, Pe->next = e[s];
  e[s] = Pe;
  ++Pe;
  Pe->t = s, Pe->c = 0, Pe->next = e[t];
  e[t] = Pe;
  e[s]->pair = e[t];
  e[t]->pair = e[s];
}
void prepare() {
  if (Pool == NULL) Pool = new etype[1000001];
  Pe = Pool;
  memset(e, 0, sizeof(e));
}
int MaxFlow() {
  flow = 0, cost = 0;
  memcpy(eb, e, sizeof(e));
  memset(pi, 0, sizeof(pi));
  do {
    do memset(v, 0, sizeof(v));
    while (aug(S, maxint));
  } while (fix());
  return flow;
}
int nDog, nPeople;
int oriSex[10001];
int g;
int dogNode(int x) { return 1 + x; }
int peopleNode(int x) { return 1 + 10000 + x; }
int MAIN() {
  prepare();
  S = 1, T = 1 + 10000 + 2000 + 1;
  cin >> nDog >> nPeople >> g;
  int ifAllGet = 0;
  for (int i = 1; i <= nDog; i++) cin >> oriSex[i];
  for (int i = 1; i <= nDog; i++) {
    int t;
    cin >> t;
    addedge(S, dogNode(i), tempAdd);
    addedge(dogNode(i), T, tempAdd);
    if (oriSex[i] == 0)
      addedge(dogNode(i), T, t);
    else
      addedge(S, dogNode(i), t);
  }
  for (int i = 1; i <= nPeople; i++) {
    addedge(S, peopleNode(i), tempAdd);
    addedge(peopleNode(i), T, tempAdd);
    int wantSex, pay, needDog;
    cin >> wantSex >> pay >> needDog;
    ifAllGet += pay;
    if (wantSex == 0)
      addedge(peopleNode(i), T, pay);
    else
      addedge(S, peopleNode(i), pay);
    for (int j = 1; j <= needDog; j++) {
      int t;
      cin >> t;
      if (wantSex == 1)
        addedge(peopleNode(i), dogNode(t), INF);
      else
        addedge(dogNode(t), peopleNode(i), INF);
    }
    int isFriend;
    cin >> isFriend;
    if (isFriend) {
      if (wantSex == 0)
        addedge(peopleNode(i), T, g);
      else
        addedge(S, peopleNode(i), g);
    }
  }
  cout << ifAllGet - MaxFlow() + (nDog + nPeople) * tempAdd << endl;
  return 0;
}
int main() {
  ios ::sync_with_stdio(false);
  cout << fixed << setprecision(16);
  return MAIN();
}
