#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<fstream>
#include<algorithm>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define CLR(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const int maxn=2e5+10;
vector<int>sp[maxn];
int pre[maxn*2],init[maxn];
int find(int x){
return x==pre[x]?x:pre[x]=find(pre[x]);
}
void Union(int a,int b){
if(find(a)!=find(b))pre[find(a)]=find(b);
}
int main(){
int x,y,n,m,i,j;
scanf("%d%d",&n,&m);
rep(i,1,n)scanf("%d",&init[i]);
rep(i,1,m){
scanf("%d",&x);
rep(j,1,x){
scanf("%d",&y);
sp[y].push_back(i);
}
}
rep(i,1,m*2)pre[i]=i;
for(i=1;i<=n;i++){
int a=sp[i][0],b=sp[i][1];
if(!init[i]){
Union(a,b+m);
Union(a+m,b);
}
else{
Union(a,b);
Union(a+m,b+m);
}
}
rep(i,1,m){
if(find(i)==find(i+m)){
puts("NO");
return 0;
}
}
puts("YES");
return 0;
}