#include <bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
int a[M], col[M], flag;
bool vis[M];
vector<int> vc[M];
vector<pair<int, int> > node[M];
void bfs(int sta) {
  col[sta] = 0;
  vis[sta] = true;
  queue<int> q;
  q.push(sta);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    int len = node[u].size();
    for (int i = 0; i < len; i++) {
      int co = col[u];
      pair<int, int> v = node[u][i];
      if (v.second == 0) {
        co ^= 1;
      }
      if (vis[v.first] && col[v.first] != co) {
        flag = false;
        return;
      }
      if (!vis[v.first]) {
        col[v.first] = co;
        vis[v.first] = true;
        q.push(v.first);
      }
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= m; i++) {
    int sz;
    scanf("%d", &sz);
    for (int j = 1; j <= sz; j++) {
      int x;
      scanf("%d", &x);
      vc[x].push_back(i);
    }
  }
  for (int i = 1; i <= n; i++) {
    int u = vc[i][0], v = vc[i][1];
    node[v].push_back(make_pair(u, a[i]));
    node[u].push_back(make_pair(v, a[i]));
  }
  memset(vis, false, sizeof(vis));
  memset(col, -1, sizeof(col));
  flag = true;
  for (int i = 1; i <= m; i++) {
    if (!vis[i]) {
      bfs(i);
    }
  }
  if (flag)
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}
