#include <iostream>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <regex> //正規表現
#include <map>
#include <set>
#include <cassert> //assart
using namespace std;
#define ll long long int
#define FOR(i,min,max) for(int i=(min);i<(max);i++)
#define FOReq(i,min,max) for(int i=(min);i<=(max);i++)
#define FORREV(i,max,min) for(int i=(max)-1;i>=(min);i--)
const int  MOD=1e9+7;
const int  INF=2000000000;
const int INF2=  10000000;
const double  Micro=1e-5;

int UnUsedVariable(){
    if(INF || Micro || MOD || INF2){;}
    return 0;
}

#define pf printf
#define sf scanf
#define inarray(array,min,max) FOR(i,min,max){cin>>array[i];}
#define inarrayW(arrayA,arrayB,min,max) FOR(i,min,max){cin>>arrayA[i]>>arrayB[i];}
inline int isEven(int x){return x%2==0;}
inline int isOdd (int x){return x%2==1;}
#define br printf("\n");
#define OutputAndReturn0(x) {cout<<(x)<<endl;return 0;}

int printintN(int array[],const int num){
    for(int i=0;i<num;i++){printf("%d ",array[i]);}
    br;
    return 0;
}
int IntPow(int x, int n){
    if(n == 0)
        return 1;
    if(n % 2 == 0)
        return IntPow(x * x, n / 2);
    else
        return x * IntPow(x, n - 1);
}
int BitN(int n){
    assert(n>=0);
    return (int)IntPow(2, n);
}


//#define int long long int

/*
 1.困った時こそ冷静に問題文を見直す！制約条件を見ろ！乱択アルゴリズムとかO(N^3)とか！
 2.一度に大量のことをやろうとしない。デバッグしやすいように細かく！
 3.プログラミングは半分数学だし、もう半分は数学ではない！
 4.できない問題はできない！！！！！
 */

int experiment(){
    int ans;ans=0;
    int N,M;
    cin>>N>>M;
    int k[M];
    int s[M][N];
    FOR(i, 0, M){
        FOR(q, 0, N){
            s[i][q]=0;
        }
    }
    
    FOR(i, 0, M){
        cin>>k[i];
        FOR(p, 0, k[i]){
            int num;
            cin>>num;
            s[i][num-1]=1;
        }
    }
    
    int p[M];
    inarray(p, 0, M);
    
//    pf("N=%d,M=%d\n",N,M);
//    cout<<"k is ";
//    printintN(k, M);
//    cout<<"p is ";
//    printintN(p, M);
//    FOR(a, 0, M){
//        FOR(b, 0, N){
//            pf("s%d_%dis%d. ",a,b,s[a][b]);
//        }
//        br;
//    }
//    br;
//
    int NumPattern=IntPow(2, N);
//    FOR(i, 0, NumPattern){
//        int SwitchPattern[N];
//        FOR(a, 0, N){
//            SwitchPattern[a]=(i/IntPow(2,a)%2);
//        }
//        int sum=0;
//        bool LightOn=true;
//        //FOR(r, 0, M){
//
//            FOR(q, 0, N){
//                if(s[2][q]==1 and SwitchPattern[q]==1)sum++;
//            }
//            if(sum%2!=p[2])LightOn=false;
//
//        //}
//        if(LightOn==true)ans++;
//
//        printintN(SwitchPattern, N);
//        pf("LightOn is %d\n",LightOn);
//    }
    FOR(i, 0, NumPattern){
        int SwitchPattern[N];
        FOR(a, 0, N){
            SwitchPattern[a]=(i/IntPow(2,a)%2);
        }
        int sum=0;
        bool LightOn=true;
        FOR(r, 0, M){
            sum=0;
            FOR(q, 0, N){
                if(s[r][q]==1 and SwitchPattern[q]==1)sum++;
            }
            if(sum%2!=p[r])LightOn=false;
            
            if(LightOn==false)break;
        }
        if(LightOn==true)ans++;
        
        //printintN(SwitchPattern, N);
        //pf("LightOn is %d\n",LightOn);
    }
    OutputAndReturn0(ans);
    return 0;
}
signed main(){
    assert(1);
    experiment();
    return 0;
}


Measured memory_bytes: 384