#include <bits/stdc++.h>
using namespace std;
struct Edge {
  long long int from, to, cost;
};
long long int mod(long long int a, long long int mod) {
  long long int res = a % mod;
  if (res < 0) res = res + mod;
  return res;
}
long long int modpow(long long int a, long long int n, long long int mod) {
  long long int res = 1;
  while (n > 0) {
    if (n & 1) res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}
long long int modinv(long long int a, long long int mod) {
  return modpow(a, mod - 2, mod);
}
long long int gcd(long long int a, long long int b) {
  long long int r = a % b;
  if (r == 0)
    return b;
  else
    return gcd(b, a % b);
}
bool is_prime(long long int n) {
  long long int i = 2;
  if (n == 1) return false;
  if (n == 2) return true;
  bool res = true;
  while (i * i < n) {
    if (n % i == 0) {
      res = false;
    }
    i = i + 1;
  }
  if (n % i == 0) res = false;
  return res;
}
int main() {
  long long int N, M;
  cin >> N >> M;
  vector<vector<long long int> > s(N);
  for (long long int i = 0; i < (M); i++) {
    long long int tmp;
    cin >> tmp;
    for (long long int i = 0; i < (tmp); i++) {
      long long int a;
      cin >> a;
      a--;
      s[a].push_back(i);
    }
  }
  vector<long long int> p(M);
  for (long long int i = 0; i < (M); i++) {
    cin >> p[i];
  }
  long long int cnt = 0;
  for (long long int i = 0; i < (pow(2, N)); i++) {
    vector<long long int> ans(M, 0);
    vector<long long int> dig(N);
    for (long long int j = 0; j < (N); j++) {
      dig[j] = i >> j & 1;
      if (i >> j & 1) {
        for (long long int ii = 0; ii < (s[j].size()); ii++) {
          ans[s[j][ii]] += 1;
        }
      }
    }
    bool tmp = true;
    for (long long int j = 0; j < (M); j++) {
      tmp = tmp and (ans[j] % 2 == p[j]);
    }
    if (tmp) cnt++;
  }
  cout << cnt;
  return 0;
}
