N, M = list(map(int,input().rstrip().split()))
k = []
s = []
for i in range(M):
    stdin = list(map(int,input().rstrip().split()))
    k.append(stdin[0])
    s.append(stdin[1:])
p = list(map(int,input().rstrip().split()))
ans = 0
for bit in range(2**N):
    od = 0
    for j in range(M):
        odd = 0
        for sw in s[j]:
            mask = 1 << (sw-1)
            if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
        if p[j] != odd%2:
            break
    else:
        ans += 1
print(ans) N, M = list(map(int,input().rstrip().split())) N list(map(int,input().rstrip().split())) list map(int,input().rstrip().split()) map int input().rstrip().split() ().rstrip().split ().rstrip() ().rstrip () input rstrip split M k = [] k [] s = [] s [] for i in range(M):
    stdin = list(map(int,input().rstrip().split()))
    k.append(stdin[0])
    s.append(stdin[1:]) i range(M) range M stdin = list(map(int,input().rstrip().split())) stdin list(map(int,input().rstrip().split())) list map(int,input().rstrip().split()) map int input().rstrip().split() ().rstrip().split ().rstrip() ().rstrip () input rstrip split k.append(stdin[0]) k.append k append stdin[0] stdin 0 s.append(stdin[1:]) s.append s append stdin[1:] stdin 1: 1 p = list(map(int,input().rstrip().split())) p list(map(int,input().rstrip().split())) list map(int,input().rstrip().split()) map int input().rstrip().split() ().rstrip().split ().rstrip() ().rstrip () input rstrip split ans = 0 ans 0 for bit in range(2**N):
    od = 0
    for j in range(M):
        odd = 0
        for sw in s[j]:
            mask = 1 << (sw-1)
            if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
        if p[j] != odd%2:
            break
    else:
        ans += 1 bit range(2**N) range 2**N 2 N od = 0 od 0 for j in range(M):
        odd = 0
        for sw in s[j]:
            mask = 1 << (sw-1)
            if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
        if p[j] != odd%2:
            break
    else:
        ans += 1 j range(M) range M odd = 0 odd 0 for sw in s[j]:
            mask = 1 << (sw-1)
            if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
         sw s[j] s j mask = 1 << (sw-1) mask 1 << (sw-1) 1 sw-1 sw 1 if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
         bit&mask bit mask odd += 1 odd 1 if p[j] != odd%2:
            break
     p[j] != odd%2 p[j] p j odd%2 odd 2 break ans += 1 ans 1 print(ans) print ans k = [] [] k ans += 1 1 ans M = list(map(int,input().rstrip().split())) list(map(int,input().rstrip().split())) M ans = 0 0 ans s = [] [] s od = 0 0 od odd = 0 0 odd p = list(map(int,input().rstrip().split())) list(map(int,input().rstrip().split())) p stdin = list(map(int,input().rstrip().split())) list(map(int,input().rstrip().split())) stdin odd += 1 1 odd mask = 1 << (sw-1) 1 << (sw-1) mask N, M = list(map(int,input().rstrip().split())) list(map(int,input().rstrip().split())) N
N, M = list(map(int,input().rstrip().split()))
k = []
s = []
for i in range(M):
    stdin = list(map(int,input().rstrip().split()))
    k.append(stdin[0])
    s.append(stdin[1:])
p = list(map(int,input().rstrip().split()))
ans = 0
for bit in range(2**N):
    od = 0
    for j in range(M):
        odd = 0
        for sw in s[j]:
            mask = 1 << (sw-1)
            if bit&mask: # 右からi番目にビットが立っているかどうか判定
                odd += 1
        if p[j] != odd%2:
            break
    else:
        ans += 1
print(ans)