#include <bits/stdc++.h>
using namespace std;
struct node {
  int k;
  int a[15];
  int p;
} s[15];
int main() {
  int n, m;
  int i, j, k;
  int b[15], num, flag, ans, flag1;
  scanf("%d%d", &n, &m);
  {
    ans = 0;
    for (i = 0; i < m; i++) {
      scanf("%d", &s[i].k);
      for (j = 0; j < s[i].k; j++) {
        scanf("%d", &s[i].a[j]);
      }
    }
    for (i = 0; i < m; i++) scanf("%d", &s[i].p);
    for (i = 0; i < (1 << n); i++) {
      flag = flag1 = 0;
      memset(b, 0, sizeof(b));
      for (j = 0; j < n; j++) {
        if (i & (1 << j)) {
          b[j + 1] = 1;
          flag1 = 1;
        }
      }
      if (flag1 == 0) continue;
      for (j = 0; j < m; j++) {
        num = 0;
        for (k = 0; k < s[j].k; k++) {
          if (b[s[j].a[k]] == 1) num++;
        }
        if (num % 2 != s[j].p) {
          flag = 1;
          break;
        }
      }
      if (flag == 0) ans++;
    }
    printf("%d\n", ans);
  }
  return 0;
}
