#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <random>
#include <chrono>
#include <iomanip>
#define lint long long int
#define FOR(x, to) for(int x=0; x<(int)(to); x++) // for簡略表記
#define DUMP(ar) for(int loop=0; loop<(int)ar.size(); loop++) cout << "[" << loop << "]:" << ar[loop] << endl // 配列一覧表示
#define DUMPL(ar) for(int loop=0; loop<(int)ar.size(); loop++) { cout << ar[loop]; if(loop<(int)ar.size()-1) cout << ' '; } cout << endl; // 配列一行一覧表示
#define COUT(x) cout << x << endl // 単要素出力
#define ALL(ar) ar.begin(), ar.end() // コンテナの全要素
#define LOOPD(i) cout << "ループ[" << i << "]回目---------------" << endl // ループ回数デバグ
using namespace std;
// cout << fixed << setprecision(4) で小数点以下4桁の桁そろえ
// cout << setw(5) << ... で表示形式を5桁に設定 5桁未満なら頭に空白がつく 5桁越なら先頭から5桁まで
// cout << setw(5) << setfill('0') << ... で空白部分の埋め文字に5を使う
// getline(cin, [変数]); で空白などを含む入力の受け取り(行ごとの受け取り)
// cin >> ws; でそこまでにストリームに残されたホワイトスペースを取り除く(=以降のgetlineの有効化)

struct prf{
    int x;
    int y;
    prf(int xx=-1, int yy=-1){
        x = xx;
        y = yy;
    }
};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;
    vector<int> a(n);
    vector<vector<prf>> p(n, vector<prf>(n));
    for(int i=0; i<n; i++){
        cin >> a[i];
        for(int k=0; k<a[i]; k++){
            cin >> p[i][k].x >> p[i][k].y;
        }
    }

    vector<bool> ans(n, true);
    int lp = pow(2, n);
    for(int j=0; j<lp; j++){
        bool flag = false;

        for(int i=0; i<n; i++){
            for(int k=0; k<a[i]; k++){
                if(p[i][k].x == -1) break;
                if(ans[p[i][k].x-1] == true){
                    if((ans[i] == true && p[i][k].y == 0)){
                        flag = true;
                    }
                }else{
                    if((ans[i] == true && p[i][k].y == 1)){
                        flag = true;
                    }
                }
                if(flag) break;
            }
            if(flag) break;
        }

        if(!flag) break;
        if(j == lp-1) break;

        /*
        if(ans[0] == true){
            ans[0] = false;
        }else{
            ans[0] = true;
            int target = 1;
            while(target < n){
                if(ans[target] == true){
                    ans[target] = false;
                    break;
                }else{
                    ans[target++] = true;
                }
            }
        }
        */
        int t_counter = 0;
        int target = n-1;
        for(int i=target; i>=0; i--){
            if(ans[i] == false && i == target - t_counter){
                t_counter++;
                if(t_counter == n){
                    flag = false;
                    break;
                }
                ans[i] = true;
                continue;
            }
            if(!ans[i]){
                ans[i] = true;
                ans[i+1] = false;
                for(int k=i+2; k<i+2+t_counter; k++){
                    ans[k] = false;
                }
                break;
            }
            if(i==0 && ans[i] == true){
                for(int k=0; k<t_counter+1; k++){
                    ans[k] = false;
                }
            }
        }
        
    }

    int cnt = 0;
    FOR(i, n) if(ans[i]) cnt++;
    COUT(cnt);

    return 0;
}

Measured memory_bytes: 256