#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
typedef vector<int> VI;
typedef vector<VI> VII;
typedef long long ll;
template <class T>
bool chmax(T &map<int, int> MP;, const T &b) {
  if (map<int, int> MP; < b) {
    map<int, int> MP;
    = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &map<int, int> MP;, const T &b) {
  if (b < map<int, int> MP;) {
    map<int, int> MP;
    = b;
    return 1;
  }
  return 0;
}
template <typename T>
ostream &operator<<(ostream &os, vector<T> &v) {
  os << "{";
  for (int i = 0; i < (int)v.size(); i++) {
    os << v[i] << (i < v.size() - 1 ? ", " : "");
  }
  os << "}";
  return os;
}
template <typename T>
bool all_same(vector<T> v1, vector<T> v2) {
  sort((v1).begin(), (v1).end());
  sort((v2).begin(), (v2).end(), greater<T>());
  return v1 == v2;
}
ll Max = -1e9, Min = 1e9 + 1;
string to_binString(unsigned int val) {
  if (!val) return std::string("0");
  std::string str;
  while (val != 0) {
    if ((val & 1) == 0)
      str.insert(str.begin(), '0');
    else
      str.insert(str.begin(), '1');
    val >>= 1;
  }
  return str;
}
string bit0(int n, string &str) {
  if (str.size() < n) {
    string t(n - str.size(), '0');
    str = t + str;
  }
  return str;
}
int main() {
  ll x, c, y = 0, n, m, l, w, sum = 0, sum2 = 0, ans = 0;
  string t;
  bool f = false;
  cin >> n >> m;
  VI k(m);
  VI p(m);
  VII s(m, vector<int>(n));
  for (int i = 0; i < m; i++) {
    cin >> k[i];
    for (int j = 0; j < k[i]; j++) {
      cin >> s[i][j];
    }
  }
  for (int i = 0; i < m; i++) {
    cin >> p[i];
  }
  for (int i = 0; i <= pow(2, n) - 1; i++) {
    t = to_binString(i);
    bit0(n, t);
    bool ok = true;
    sum = 0;
    for (int j = 0; j < m; j++) {
      for (int o = 0; o < k[j]; o++) {
        if (t[(s[j][o]) - 1] - '0' > 0) {
          sum++;
        }
      }
      sum %= 2;
      if (sum != p[j]) {
        ok = false;
      }
    }
    if (ok) {
      ans++;
    }
  }
  cout << ans << endl;
  return 0;
}
