def c_switches(N, M, Switches, P):

    import numpy as np



    def rank_matrix(matrix):

        """mod2 上で行列の階数を求める"""

        num_row, num_col = matrix.shape[0], matrix.shape[1]

        rank = 0



        for col in range(num_col):

            # ピボット探し

            pivot = -1

            max_element = 0  # 最大の要素(1しかないが)がある場所を探す

            for row in range(rank, num_row):

                if matrix[row][col] > max_element:

                    max_element = matrix[row][col]

                    pivot = row

            if pivot == -1:

                continue  # ピボットが見つからない。次の列へ



            tmp = matrix[pivot, :].copy()

            matrix[pivot, :] = matrix[rank, :]

            matrix[rank, :] = tmp



            # (行列の要素は0または1しかないので、ピボットの値を1にする操作は不要)

            # ピボットのある列の値がすべて0となるように、掃き出しを行う

            for row in range(num_row):

                if row != rank and matrix[row][col] == 1:

                    for col2 in range(num_col):

                        matrix[row][col2] = (matrix[row][col2] + matrix[rank][col2]) % 2

            rank += 1

        return rank



    # 電球iがスイッチjとつながっているとき a_{ij}=1, そうでないなら0とする

    a = np.zeros((M, N), dtype='int8')

    for t, (_, *switches) in enumerate(Switches):

        for s in switches:

            a[t][s - 1] = 1

    p = np.reshape(P, (-1, 1))

    ap = np.concatenate((a, p), axis=1)  # 拡大係数行列

    rank_a, rank_ap = rank_matrix(a), rank_matrix(ap)

    return 2**(N - rank_a) if rank_a == rank_ap else 0

    # 参考: http://drken1215.hatenablog.com/entry/2019/03/20/202800



N, M = [int(i) for i in input().split()]

Switches = [[int(i) for i in input().split()] for j in range(M)]

P = [int(i) for i in input().split()]

print((c_switches(N, M, Switches, P)))
def c_switches(N, M, Switches, P):

    import numpy as np



    def rank_matrix(matrix):

        """mod2 上で行列の階数を求める"""

        num_row, num_col = matrix.shape[0], matrix.shape[1]

        rank = 0



        for col in range(num_col):

            # ピボット探し

            pivot = -1

            max_element = 0  # 最大の要素(1しかないが)がある場所を探す

            for row in range(rank, num_row):

                if matrix[row][col] > max_element:

                    max_element = matrix[row][col]

                    pivot = row

            if pivot == -1:

                continue  # ピボットが見つからない。次の列へ



            tmp = matrix[pivot, :].copy()

            matrix[pivot, :] = matrix[rank, :]

            matrix[rank, :] = tmp



            # (行列の要素は0または1しかないので、ピボットの値を1にする操作は不要)

            # ピボットのある列の値がすべて0となるように、掃き出しを行う

            for row in range(num_row):

                if row != rank and matrix[row][col] == 1:

                    for col2 in range(num_col):

                        matrix[row][col2] = (matrix[row][col2] - matrix[rank][col2]) % 2

            rank += 1

        return rank



    # 電球iがスイッチjとつながっているとき a_{ij}=1, そうでないなら0とする

    a = np.zeros((M, N), dtype='int8')

    for t, (_, *switches) in enumerate(Switches):

        for s in switches:

            a[t][s - 1] = 1

    p = np.reshape(P, (-1, 1))

    ap = np.concatenate((a, p), axis=1)  # 拡大係数行列

    rank_a, rank_ap = rank_matrix(a), rank_matrix(ap)

    return 2**(N - rank_a) if rank_a == rank_ap else 0

    # 参考: http://drken1215.hatenablog.com/entry/2019/03/20/202800



N, M = [int(i) for i in input().split()]

Switches = [[int(i) for i in input().split()] for j in range(M)]

P = [int(i) for i in input().split()]

print((c_switches(N, M, Switches, P)))
def c_switches(N, M, Switches, P):
    import numpy as np

    def rank_matrix(matrix):
        """mod2 上で行列の階数を求める"""
        num_row, num_col = matrix.shape[0], matrix.shape[1]
        rank = 0
        for col in range(num_col):
            # ピボット探し
            pivot = -1
            max_element = 0  # 最大の要素(1しかないが)がある場所を探す
            for row in range(rank, num_row):
                if matrix[row][col] > max_element:
                    max_element = matrix[row][col]
                    pivot = row
            if pivot == -1:
                continue  # ピボットが見つからない。次の列へ
            tmp = matrix[pivot, :].copy()
            matrix[pivot, :] = matrix[rank, :]
            matrix[rank, :] = tmp
            # (行列の要素は0または1しかないので、ピボットの値を1にする操作は不要)
            # ピボットのある列の値がすべて0となるように、掃き出しを行う
            for row in range(num_row):
                if row != rank and matrix[row][col] == 1:
                    for col2 in range(num_col):
                        matrix[row][col2] = (matrix[row][col2] + matrix[rank][col2]) % 2
            rank += 1
        return rank

    # 電球iがスイッチjとつながっているとき a_{ij}=1, そうでないなら0とする
    a = np.zeros((M, N), dtype="int8")
    for t, (_, *switches) in enumerate(Switches):
        for s in switches:
            a[t][s - 1] = 1
    p = np.reshape(P, (-1, 1))
    ap = np.concatenate((a, p), axis=1)  # 拡大係数行列
    rank_a, rank_ap = rank_matrix(a), rank_matrix(ap)
    return 2 ** (N - rank_a) if rank_a == rank_ap else 0
    # 参考: http://drken1215.hatenablog.com/entry/2019/03/20/202800


N, M = [int(i) for i in input().split()]
Switches = [[int(i) for i in input().split()] for j in range(M)]
P = [int(i) for i in input().split()]
print((c_switches(N, M, Switches, P)))

def c_switches(N, M, Switches, P):
    import numpy as np

    def rank_matrix(matrix):
        """mod2 上で行列の階数を求める"""
        num_row, num_col = matrix.shape[0], matrix.shape[1]
        rank = 0
        for col in range(num_col):
            # ピボット探し
            pivot = -1
            max_element = 0  # 最大の要素(1しかないが)がある場所を探す
            for row in range(rank, num_row):
                if matrix[row][col] > max_element:
                    max_element = matrix[row][col]
                    pivot = row
            if pivot == -1:
                continue  # ピボットが見つからない。次の列へ
            tmp = matrix[pivot, :].copy()
            matrix[pivot, :] = matrix[rank, :]
            matrix[rank, :] = tmp
            # (行列の要素は0または1しかないので、ピボットの値を1にする操作は不要)
            # ピボットのある列の値がすべて0となるように、掃き出しを行う
            for row in range(num_row):
                if row != rank and matrix[row][col] == 1:
                    for col2 in range(num_col):
                        matrix[row][col2] = (matrix[row][col2] - matrix[rank][col2]) % 2
            rank += 1
        return rank

    # 電球iがスイッチjとつながっているとき a_{ij}=1, そうでないなら0とする
    a = np.zeros((M, N), dtype="int8")
    for t, (_, *switches) in enumerate(Switches):
        for s in switches:
            a[t][s - 1] = 1
    p = np.reshape(P, (-1, 1))
    ap = np.concatenate((a, p), axis=1)  # 拡大係数行列
    rank_a, rank_ap = rank_matrix(a), rank_matrix(ap)
    return 2 ** (N - rank_a) if rank_a == rank_ap else 0
    # 参考: http://drken1215.hatenablog.com/entry/2019/03/20/202800


N, M = [int(i) for i in input().split()]
Switches = [[int(i) for i in input().split()] for j in range(M)]
P = [int(i) for i in input().split()]
print((c_switches(N, M, Switches, P)))

-                        matrix[row][col2] = (matrix[row][col2] + matrix[rank][col2]) % 2 +                        matrix[row][col2] = (matrix[row][col2] - matrix[rank][col2]) % 2