# bit全順列列挙
def bitall(n):
    parm = []
    for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
    return parm


N, M = map(int, input().split())
K = []
S = []
for m in range(M):
    tmp = list(map(int, input().split()))
    K.append(tmp[0])
    S.append(tmp[1:])
P = list(map(int, input().split()))

swi_parms = bitall(N)
ans =0

for swi_parm in swi_parms:
    flag = 0
    for k in range(len(K)):
        cnt = 0
        
        for s in S[k]:
            # 対応するスイッチのon数をカウント
            if swi_parm[s-1] == 1: cnt += 1
        
        if cnt%2 == P[k]:
            continue
        else:
            flag = 1
            break
    if flag == 0:
        ans += 1

print(ans) def bitall(n):
    parm = []
    for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
    return parm bitall parm = [] parm [] for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
     i range(1<<n) range 1<<n 1 n 0 for _ in range(n) for _ in range(n) _ range(n) range n for _ in range(n) 0 on = [0 for _ in range(n)] on [0 for _ in range(n)] for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
         j range(n) range n if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
         i & (1<<j) i 1<<j 1 j on[j] = 1 on[j] on j 1 parm.append(on) parm.append parm append on return parm parm n n N, M = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M K = [] K [] S = [] S [] for m in range(M):
    tmp = list(map(int, input().split()))
    K.append(tmp[0])
    S.append(tmp[1:]) m range(M) range M tmp = list(map(int, input().split())) tmp list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split K.append(tmp[0]) K.append K append tmp[0] tmp 0 S.append(tmp[1:]) S.append S append tmp[1:] tmp 1: 1 P = list(map(int, input().split())) P list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split swi_parms = bitall(N) swi_parms bitall(N) bitall N ans =0 ans 0 for swi_parm in swi_parms:
    flag = 0
    for k in range(len(K)):
        cnt = 0
        
        for s in S[k]:
            # 対応するスイッチのon数をカウント
            if swi_parm[s-1] == 1: cnt += 1
        
        if cnt%2 == P[k]:
            continue
        else:
            flag = 1
            break
    if flag == 0:
        ans += 1 swi_parm swi_parms flag = 0 flag 0 for k in range(len(K)):
        cnt = 0
        
        for s in S[k]:
            # 対応するスイッチのon数をカウント
            if swi_parm[s-1] == 1: cnt += 1
        
        if cnt%2 == P[k]:
            continue
        else:
            flag = 1
            break
     k range(len(K)) range len(K) len K cnt = 0 cnt 0 for s in S[k]:
            # 対応するスイッチのon数をカウント
            if swi_parm[s-1] == 1: cnt += 1
        
         s S[k] S k if swi_parm[s-1] == 1: cnt += 1
        
         swi_parm[s-1] == 1 swi_parm[s-1] swi_parm s-1 s 1 1 if cnt%2 == P[k]:
            continue
        else:
            flag = 1
            break
     cnt%2 == P[k] cnt%2 cnt 2 P[k] P k continue flag = 1 flag 1 break if flag == 0:
        ans += 1 flag == 0 flag 0 ans += 1 ans 1 print(ans) print ans N, M = map(int, input().split()) map(int, input().split()) N P = list(map(int, input().split())) list(map(int, input().split())) P swi_parms = bitall(N) bitall(N) swi_parms cnt = 0 0 cnt M = map(int, input().split()) map(int, input().split()) M tmp = list(map(int, input().split())) list(map(int, input().split())) tmp K = [] [] K S = [] [] S flag = 0 0 flag def bitall(n):
    parm = []
    for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
    return parm def bitall(n):
    parm = []
    for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
    return parm bitall ans =0 0 ans flag = 1 1 flag ans += 1 1 ans
# bit全順列列挙
def bitall(n):
    parm = []
    for i in range(1<<n): # 0/1の組み合わせは1<<n(=2**n)通り存在。
        on = [0 for _ in range(n)] # とりあえず全て0にしておく。
        
        for j in range(n):
            if i & (1<<j): # iのj桁目が1となっている場所をonにする。
                on[j] = 1
                
        parm.append(on)
                
    return parm


N, M = map(int, input().split())
K = []
S = []
for m in range(M):
    tmp = list(map(int, input().split()))
    K.append(tmp[0])
    S.append(tmp[1:])
P = list(map(int, input().split()))

swi_parms = bitall(N)
ans =0

for swi_parm in swi_parms:
    flag = 0
    for k in range(len(K)):
        cnt = 0
        
        for s in S[k]:
            # 対応するスイッチのon数をカウント
            if swi_parm[s-1] == 1: cnt += 1
        
        if cnt%2 == P[k]:
            continue
        else:
            flag = 1
            break
    if flag == 0:
        ans += 1

print(ans)