#include <bits/stdc++.h>
int i, j, k;
struct edge {
  int to;
  int cost;
};
using namespace std;
using P = pair<int, int>;
bool compare_by_b(pair<int, pair<string, int>> a,
                  pair<int, pair<string, int>> b) {
  if (a.second.first != b.second.first) {
    return a.second.first < b.second.first;
  } else {
    return a.second.second > b.second.second;
  }
}
int main(void) {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> sw;
  for (i = 0; i < m; i++) {
    int k;
    cin >> k;
    vector<int> ahi;
    for (j = 0; j < k; j++) {
      int sw1;
      cin >> sw1;
      ahi.push_back(sw1);
    }
    sw.push_back(ahi);
  }
  vector<int> p;
  for (i = 0; i < m; i++) {
    int aaa;
    cin >> aaa;
    p.push_back(aaa);
  }
  int num = 1;
  int ans = 0;
  for (i = 0; i < n; i++) {
    num *= 2;
  }
  for (i = 0; i < num; i++) {
    int isOn[n + 1];
    for (j = 0; j < n; j++) {
      isOn[j + 1] = (i >> (n - 1 - j)) % 2;
    }
    int cnt = 0;
    int ons = 0;
    for (j = 0; j < m; j++) {
      for (k = 0; k < sw[j].size(); k++) {
        cnt += isOn[sw[j][k]];
      }
      if (cnt % 2 == p[j]) {
        ons += 1;
      }
    }
    if (ons == m) {
      ans += 1;
    }
  }
  cout << ans << endl;
  return 0;
}
