N = int(eval(input()))



lst = [[] for _ in range(N)]

for i in range(N):

    A = int(eval(input()))

    for _ in range(A):

        x, y = list(map(int, input().split()))

        lst[i].append([x - 1, y])



ans = 0

for i in range(2 ** N):

    check = [-1] * N #1:正直者、0:不親切

    count = 0 #カウント用

    flag = True

    for j in range(N):

        if (i >> j) & 1: #正直者のとき

            if check[j] == 0: #矛盾しているとき

                flag = False

                break

            else:

                check[j] = 1



            # count += 1



            for x, y in lst[j]:

                if y == 1: #行き先が正直者

                    if check[x] != 0:

                        check[x] = 1

                    else: #矛盾しているとき

                        flag = False

                        break

                else: #y == 0

                    if check[x] != 1:

                        check[x] = 0

                    else:

                        flag = False

                        break

        else: #正直者でないとき

            if check[j] == 1:

                flag = False

                break

            else:

                check[j] = 0



        if flag == False:

            break

    if flag:

        tmp = 0

        for j in range(N):

            if (i >> j) & 1:

                tmp += 1

        # print (i)

        # print (check, flag)

        ans = max(ans, tmp)



print (ans)

# print (lst)
import sys

input = sys.stdin.readline

sys.setrecursionlimit(10 ** 9)

MOD = 10 ** 9 + 7



N = int(eval(input()))

lst = [[] for _ in range(N)]



for i in range(N):

    A = int(eval(input()))

    for _ in range(A):

        XY = tuple(map(int, input().split()))

        lst[i].append(XY)





ans = 0

for i in range(2 ** N):

    count = 0

    flag = True

    for j in range(N):

        if (i >> j) & 1: #正直者の時、証言を確認する

            for x, y in lst[j]:

                if y == 1:

                    if (i >> (x - 1)) & 1:

                        continue

                    else:

                        pass

                if y == 0:

                    if (i >> (x - 1)) & 1:

                        pass

                    else:

                        continue

                flag = False

                break

            count += 1

        if not flag:

            break

    if flag:

        ans = max(ans, count)



print (ans)





N = int(eval(input()))
lst = [[] for _ in range(N)]
for i in range(N):
    A = int(eval(input()))
    for _ in range(A):
        x, y = list(map(int, input().split()))
        lst[i].append([x - 1, y])
ans = 0
for i in range(2**N):
    check = [-1] * N  # 1:正直者、0:不親切
    count = 0  # カウント用
    flag = True
    for j in range(N):
        if (i >> j) & 1:  # 正直者のとき
            if check[j] == 0:  # 矛盾しているとき
                flag = False
                break
            else:
                check[j] = 1
            # count += 1
            for x, y in lst[j]:
                if y == 1:  # 行き先が正直者
                    if check[x] != 0:
                        check[x] = 1
                    else:  # 矛盾しているとき
                        flag = False
                        break
                else:  # y == 0
                    if check[x] != 1:
                        check[x] = 0
                    else:
                        flag = False
                        break
        else:  # 正直者でないとき
            if check[j] == 1:
                flag = False
                break
            else:
                check[j] = 0
        if flag == False:
            break
    if flag:
        tmp = 0
        for j in range(N):
            if (i >> j) & 1:
                tmp += 1
        # print (i)
        # print (check, flag)
        ans = max(ans, tmp)
print(ans)
# print (lst)

import sys

input = sys.stdin.readline
sys.setrecursionlimit(10**9)
MOD = 10**9 + 7
N = int(eval(input()))
lst = [[] for _ in range(N)]
for i in range(N):
    A = int(eval(input()))
    for _ in range(A):
        XY = tuple(map(int, input().split()))
        lst[i].append(XY)
ans = 0
for i in range(2**N):
    count = 0
    flag = True
    for j in range(N):
        if (i >> j) & 1:  # 正直者の時、証言を確認する
            for x, y in lst[j]:
                if y == 1:
                    if (i >> (x - 1)) & 1:
                        continue
                    else:
                        pass
                if y == 0:
                    if (i >> (x - 1)) & 1:
                        pass
                    else:
                        continue
                flag = False
                break
            count += 1
        if not flag:
            break
    if flag:
        ans = max(ans, count)
print(ans)

+import sys + +input = sys.stdin.readline +sys.setrecursionlimit(10**9) +MOD = 10**9 + 7 -        x, y = list(map(int, input().split())) -        lst[i].append([x - 1, y]) +        XY = tuple(map(int, input().split())) +        lst[i].append(XY) -    check = [-1] * N  # 1:正直者、0:不親切 -    count = 0  # カウント用 +    count = 0 -        if (i >> j) & 1:  # 正直者のとき -            if check[j] == 0:  # 矛盾しているとき +        if (i >> j) & 1:  # 正直者の時、証言を確認する +            for x, y in lst[j]: +                if y == 1: +                    if (i >> (x - 1)) & 1: +                        continue +                    else: +                        pass +                if y == 0: +                    if (i >> (x - 1)) & 1: +                        pass +                    else: +                        continue -            else: -                check[j] = 1 -            # count += 1 -            for x, y in lst[j]: -                if y == 1:  # 行き先が正直者 -                    if check[x] != 0: -                        check[x] = 1 -                    else:  # 矛盾しているとき -                        flag = False -                        break -                else:  # y == 0 -                    if check[x] != 1: -                        check[x] = 0 -                    else: -                        flag = False -                        break -        else:  # 正直者でないとき -            if check[j] == 1: -                flag = False -                break -            else: -                check[j] = 0 -        if flag == False: +            count += 1 +        if not flag: -        tmp = 0 -        for j in range(N): -            if (i >> j) & 1: -                tmp += 1 -        # print (i) -        # print (check, flag) -        ans = max(ans, tmp) +        ans = max(ans, count) -# print (lst)