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

    honest = [0] * len(XY)

    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

 

    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)

    

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)


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
    honest = [0] * len(XY)
    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
    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)


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)

-    honest = [0] * len(XY) +                break +        if not is_contradiction: +            break