n = int(eval(input()))



XY = []

for i in range(n):

    a = int(eval(input()))

    xy = []

    for j in range(a):

        xy.append(list(map(int, input().split())))

    

    XY.append(xy)

    

def check(i, xiyj, HoU):

    # 矛盾したらFalse 正直者と仮定した証言より 正直&正直者と仮定されている / 不親切&不親切と仮定されている True

    if ((i >> xiyj) & 1) ^ HoU:

        return False



    return True

    

max_honest = 0

for i in range(2 ** len(XY)):

    count = 0

    is_contradiction = True

    for j in range(len(XY)):

        # 正直者と仮定したときだけ採用

        if not ((i >> j) & 1): continue

        for k in range(len(XY[j])):

            xiyj = XY[j][k][0] - 1

            HoU = XY[j][k][1]

            

            if not check(i, xiyj, HoU):

                is_contradiction = False

                break

                

        if not is_contradiction:

            break



    if is_contradiction:

        for j in range(len(XY)):

            if ((i >> j) & 1): count+=1 

                

        if count > max_honest:

            max_honest =count

            

print(max_honest)
n = int(eval(input()))



XY = []

for i in range(n):

    a = int(eval(input()))

    xy = []

    for j in range(a):

        xy.append(list(map(int, input().split())))

    

    XY.append(xy)



"""

    矛盾したらFalse

    矛盾しなければTrue

    正直者と仮定した者の証言

        正直&正直者と仮定されている

        不親切&不親切と仮定されている

"""

def check(i, xiyj, HoU):

    # XOR

    if HoU ^ ((i >> xiyj) & 1):

        return False



    return True



max_honest = 0

for i in range(2 ** len(XY)):

    count = 0

    is_contradiction = True

    for j in range(len(XY)):

        # 正直者と仮定したときだけ採用

        if not ((i >> j) & 1): continue

        count+=1

        for k in range(len(XY[j])):

            xiyj = XY[j][k][0] - 1

            HoU = XY[j][k][1]

            

            if not check(i, xiyj, HoU):

                is_contradiction = False

                break # TLE対策

                

        if not is_contradiction:

            break # TLE対策



    # 矛盾がなく、正直者の数が更新できれば更新

    if is_contradiction and (count > max_honest):

        max_honest =count

            

print(max_honest)
n = int(eval(input()))
XY = []
for i in range(n):
    a = int(eval(input()))
    xy = []
    for j in range(a):
        xy.append(list(map(int, input().split())))
    XY.append(xy)


def check(i, xiyj, HoU):
    # 矛盾したらFalse 正直者と仮定した証言より 正直&正直者と仮定されている / 不親切&不親切と仮定されている True
    if ((i >> xiyj) & 1) ^ HoU:
        return False
    return True


max_honest = 0
for i in range(2 ** len(XY)):
    count = 0
    is_contradiction = True
    for j in range(len(XY)):
        # 正直者と仮定したときだけ採用
        if not ((i >> j) & 1):
            continue
        for k in range(len(XY[j])):
            xiyj = XY[j][k][0] - 1
            HoU = XY[j][k][1]
            if not check(i, xiyj, HoU):
                is_contradiction = False
                break
        if not is_contradiction:
            break
    if is_contradiction:
        for j in range(len(XY)):
            if (i >> j) & 1:
                count += 1
        if count > max_honest:
            max_honest = count
print(max_honest)

n = int(eval(input()))
XY = []
for i in range(n):
    a = int(eval(input()))
    xy = []
    for j in range(a):
        xy.append(list(map(int, input().split())))
    XY.append(xy)
"""
    矛盾したらFalse
    矛盾しなければTrue
    正直者と仮定した者の証言
        正直&正直者と仮定されている
        不親切&不親切と仮定されている
"""


def check(i, xiyj, HoU):
    # XOR
    if HoU ^ ((i >> xiyj) & 1):
        return False
    return True


max_honest = 0
for i in range(2 ** len(XY)):
    count = 0
    is_contradiction = True
    for j in range(len(XY)):
        # 正直者と仮定したときだけ採用
        if not ((i >> j) & 1):
            continue
        count += 1
        for k in range(len(XY[j])):
            xiyj = XY[j][k][0] - 1
            HoU = XY[j][k][1]
            if not check(i, xiyj, HoU):
                is_contradiction = False
                break  # TLE対策
        if not is_contradiction:
            break  # TLE対策
    # 矛盾がなく、正直者の数が更新できれば更新
    if is_contradiction and (count > max_honest):
        max_honest = count
print(max_honest)

+""" +    矛盾したらFalse +    矛盾しなければTrue +    正直者と仮定した者の証言 +        正直&正直者と仮定されている +        不親切&不親切と仮定されている +""" -    # 矛盾したらFalse 正直者と仮定した証言より 正直&正直者と仮定されている / 不親切&不親切と仮定されている True -    if ((i >> xiyj) & 1) ^ HoU: +    # XOR +    if HoU ^ ((i >> xiyj) & 1): +        count += 1 -                break +                break  # TLE対策 -            break -    if is_contradiction: -        for j in range(len(XY)): -            if (i >> j) & 1: -                count += 1 -        if count > max_honest: -            max_honest = count +            break  # TLE対策 +    # 矛盾がなく、正直者の数が更新できれば更新 +    if is_contradiction and (count > max_honest): +        max_honest = count