#include <bits/stdc++.h>
template <int M, int N>
class GaussianElimination {
 private:
  using Matrix = std::array<std::bitset<N>, M>;
  std::array<int, M> accessIndex;
  bool keyExist(const int key_r, const int key_c) {
    for (int r_i{key_r}; r_i < M; r_i++)
      if (matrix_[accessIndex[r_i]][key_c]) {
        std::swap(accessIndex[key_r], accessIndex[r_i]);
        return true;
      }
    return false;
  }

 public:
  Matrix matrix_;
  int rank_;
  GaussianElimination(const Matrix& matrix) : matrix_(matrix) {
    for (int i{}; i < M; i++) accessIndex[i] = i;
    int key_r{};
    for (int key_c{}; key_r < N && key_c < M; key_r++, key_c++) {
      while (key_c < N && !keyExist(key_r, key_c)) key_c++;
      if (key_c == N) break;
      for (int r_i{}; r_i < M; r_i++)
        if (r_i != key_r && matrix_[accessIndex[r_i]][key_c])
          matrix_[accessIndex[r_i]] ^= matrix_[accessIndex[key_r]];
    }
    rank_ = key_r;
  }
};
int main() {
  int N, M;
  scanf("%d%d", &N, &M);
  std::array<std::bitset<11>, 10> matrix;
  for (int i{}; i < M; i++) {
    int k;
    scanf("%d", &k);
    for (int j{}; j < k; j++) {
      int s;
      scanf("%d", &s);
      s--;
      matrix[i][s] = true;
    }
  }
  for (int i{}; i < M; i++) {
    int p;
    scanf("%d", &p);
    matrix[i][N] = p == 1;
  }
  GaussianElimination<10, 11> gauss(matrix);
  bool incons{gauss.rank_ > 0};
  if (incons)
    for (int i{}; i < N; i++)
      if (gauss.matrix_[gauss.rank_ - 1][i]) incons = false;
  incons &= gauss.matrix_[gauss.rank_ - 1][N];
  if (incons)
    puts("0");
  else {
    int ans{1};
    for (int i{}; i < N - gauss.rank_; i++) ans *= 2;
    printf("%d\n", ans);
  }
  return 0;
}
