#include <bits/stdc++.h>
using namespace std;
struct ranp {
  bool adapt[10];
  bool isOn(bool env[10], int m2, int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
      if (adapt[i] && env[i]) {
        sum++;
      }
    }
    if (sum % 2 == m2) {
      return true;
    } else {
      return false;
    }
  }
  ranp() {
    for (int i = 0; i < 10; i++) {
      adapt[i] = false;
    }
  }
};
int ipow(int x, int y) {
  int z = 1;
  for (int i = 0; i < y; i++) {
    z *= x;
  }
  return z;
}
void bina(int x, bool f[10], int n) {
  for (int i = 0; i < n; i++) {
    if (x % 2) {
      f[i] = true;
    } else {
      f[i] = false;
    }
    x /= 2;
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  bool flag[10];
  int ans = 0;
  int max = ipow(2, n);
  ranp* ob = new ranp[m];
  vector<int> whitch(m);
  bool ok;
  for (int i = 0; i < m; i++) {
    int c;
    cin >> c;
    for (int i = 0; i < c; i++) {
      int num;
      cin >> num;
      ob[i].adapt[num - 1] = true;
    }
  }
  for (int i = 0; i < m; i++) {
    cin >> whitch[i];
  }
  for (int i = 0; i < max; i++) {
    bina(i, flag, n);
    ok = true;
    for (int j = 0; j < m; j++) {
      if (!ob[j].isOn(flag, whitch[j], n)) {
        ok = false;
        break;
      }
    }
    if (ok) {
      ans++;
    }
  }
  printf("%d", ans);
  return 0;
}
