#include <bits/stdc++.h>
using namespace std;
const int N = 13000;
const int INF = 1000000000;
struct edge {
  int v, cap, flow;
  int back_ind;
  edge *back;
  edge(int vi, int ci) : v(vi), cap(ci) {}
};
int n, s, t;
int e[N], h[N];
vector<edge> g[N];
vector<edge>::iterator cur[N];
void bfs(int start, int start_h) {
  queue<int> q;
  h[start] = start_h;
  for (q.push(start); !q.empty(); q.pop()) {
    int u = q.front();
    for (auto i : g[u])
      if (i.back->flow < i.back->cap && h[i.v] > h[u] + 1) {
        h[i.v] = h[u] + 1;
        q.push(i.v);
      }
  }
}
int compute_flow() {
  queue<int> q;
  for (int i = 0; i < (n); ++i) {
    for (auto &j : g[i]) {
      j.flow = 0;
      j.back = &g[j.v][j.back_ind];
    }
    cur[i] = g[i].begin();
    h[i] = e[i] = 0;
  }
  for (auto &i : g[s]) {
    i.flow = i.cap;
    i.back->flow = -i.flow;
    if (e[i.v] == 0 && i.v != t) q.push(i.v);
    e[i.v] += i.flow;
  }
  h[s] = n;
  int relabel_counter = 0;
  for (; !q.empty(); q.pop()) {
    int u = q.front();
    while (e[u] > 0) {
      if (cur[u] == g[u].end()) {
        relabel_counter++;
        h[u] = 2 * n + 1;
        for (auto i : g[u])
          if (i.flow < i.cap) h[u] = min(h[u], h[i.v] + 1);
        cur[u] = g[u].begin();
        continue;
      }
      if (cur[u]->flow < cur[u]->cap && h[u] == h[cur[u]->v] + 1) {
        int d = min(e[u], cur[u]->cap - cur[u]->flow);
        cur[u]->flow += d;
        cur[u]->back->flow -= d;
        e[u] -= d;
        e[cur[u]->v] += d;
        if (e[cur[u]->v] == d && cur[u]->v != t && cur[u]->v != s)
          q.push(cur[u]->v);
      } else
        cur[u]++;
    }
    if (relabel_counter >= n) {
      for (int i = 0; i < (n); ++i) h[i] = 2 * n + 1;
      bfs(t, 0);
      bfs(s, n);
      relabel_counter = 0;
    }
  }
  return e[t];
}
void add_edge(int a, int b, int c, int c_back = 0) {
  assert(a != b);
  g[a].push_back(edge(b, c));
  g[b].push_back(edge(a, c_back));
  g[a].back().back_ind = g[b].size() - 1;
  g[b].back().back_ind = g[a].size() - 1;
}
int d, m, glo, sex[N], cost[N], start;
void read_data() {
  cin >> d >> m >> glo;
  s = 0;
  t = 1;
  int a;
  for (int i = 2; i <= d + 1; i++) cin >> sex[i];
  for (int i = 2; i <= d + 1; i++) {
    cin >> a;
    if (!sex[i])
      add_edge(s, m + i, a);
    else
      add_edge(m + i, t, a);
  }
  int apsex, num, reward, ind;
  for (int i = 2; i <= m + 1; i++) {
    cin >> apsex >> reward >> num;
    start += reward;
    for (int j = 0; j < (num); ++j) {
      cin >> ind;
      ind++;
      if (apsex)
        add_edge(m + ind, i, INF);
      else
        add_edge(i, m + ind, INF);
    }
    cin >> a;
    if (a) reward += glo;
    if (apsex)
      add_edge(i, t, reward);
    else
      add_edge(s, i, reward);
  }
  n = 2 + d + m;
}
int main() {
  ios_base::sync_with_stdio(0);
  read_data();
  cout << start - compute_flow() << endl;
}
