#include <bits/stdc++.h>
using namespace std;
#define int long long
using P = pair<int, int>;
constexpr array<int, 4> dx = {1, 0, -1, 0};
constexpr array<int, 4> dy = {0, 1, 0, -1};
constexpr int INF = 1234567890;
constexpr int MOD = 1000000000 + 7;
// constexpr int MOD = 998244353;
template <class T>
bool chmax(T &a, const T &b)
{
    if (a < b)
    {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
bool chmin(T &a, const T &b)
{
    if (b < a)
    {
        a = b;
        return 1;
    }
    return 0;
}
constexpr int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
constexpr int fact(int n) { return n > 1 ? n * fact(n - 1) % MOD : 1; }
int modinv(int a)
{
    int b = MOD, u = 1, v = 0;
    while (b)
    {
        int t = a / b;
        a -= t * b;
        swap(a, b);
        u -= t * v;
        swap(u, v);
    }
    u %= MOD;
    if (u < 0)
        u += MOD;
    return u;
}
constexpr int modpow(int a, int n)
{
    int rtn = 1;
    while (n > 0)
    {
        if (n & 1)
            rtn = rtn * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return rtn;
}

int bit1count(int a)
{
    int count = 0;
    while (a > 0)
    {
        if (a % 2)
            count++;
        a /= 2;
    }
    return count;
}

signed main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << setprecision(10);

    int n;
    cin >> n;
    vector<int> honest_list(n);
    vector<int> unkind_list(n);
    for (int i = 0; i < n; i++)
    {
        int n_shogen;
        cin >> n_shogen;
        for (int j = 0; j < n_shogen; j++)
        {
            int x, y;
            cin >> x >> y;
            if (y == 1)
                honest_list[i] |= 1 << (x - 1);
            else
                unkind_list[i] |= 1 << (x - 1);
        }
    }

    int max_honest = 0;

    // 全部の組み合わせを探索
    // 先頭の人から順番に正直者として過程する
    // 証言に矛盾が発生したらある探索終わり
    // vector<int> order(n);
    // iota(order.begin(), order.end(), 0);
    // do
    // {
    //     // 探索した人が言った正直者と不親切な人
    //     int honest = 0, unkind = 0, seen = 0;
    //     // 証言者
    //     for (auto &&i : order)
    //     {
    //         // 証言者が不親切と言われているなら矛盾
    //         if (unkind & (1 << i) > 0)
    //             break;
    //         // 皆が不親切と言った人を正直者と言ったなら矛盾
    //         // 皆が正直者と言った人を不親切と言ったなら矛盾
    //         if (honest_list[i] & unkind || unkind_list[i] & honest)
    //             break;
    //         honest |= honest_list[i];
    //         unkind |= unkind_list[i];

    //         // 証言者は正直者と仮定
    //         honest |= 1 << i;
    //         seen |= 1 << i;
    //         // 今正直者と言われている人が全員証言したなら今は矛盾はない
    //         if (honest & seen >= honest)
    //             chmax(max_honest, bit1count(honest));
    //     }

    // } while (next_permutation(order.begin(), order.end()));

    for (int speaker = 0; speaker < (1 << n); speaker++)
    {
        int honest = speaker, unkind = 0;
        for (int i = 0; i < n; i++)
        {
            if (speaker & (1 << i))
            {
                honest |= honest_list[i];
                unkind |= unkind_list[i];
            }
        }
        if (honest & unkind)
            continue;
        if ((honest & speaker) >= honest)
            chmax(max_honest, bit1count(honest));
    }

    cout << max_honest << endl;
}


Measured memory_bytes: 256