// C - HonestOrUnkind2
#include <bits/stdc++.h>
using namespace std;
#define rp(i,s,e) for(int i=(s);i<(e);++i)

int main(){
	int N; cin>>N;
	int A[N], X[N][N], Y[N][N];//証言: "確実" | "不確実"
	rp(i, 0, N){
		cin>>A[i];
		rp(j, 0, A[i]){ cin>>X[i][j]>>Y[i][j]; X[i][j]--; }
	}

	int ans = 0;
	for(int ok=1, bits=1; bits<1<<N; ++bits, ok=1){//bits: 仮定のbit列: 0|1=不確実|確実, ok: 1|0=仮定に矛盾なし|あり
		for(int i=0; i<N && ok; ++i)
			if((bits>>i)&1)//i番目の仮定 0|1 が不確実は確認のしようがない
				for(int j=0; j<A[i] && ok; ++j) //i番目の証言は全て確実と仮定して処理
					if(((bits>>X[i][j])&1) != Y[i][j]) ok = 0;//x番目の仮定 0|1 と証言が矛盾
		if(ok) ans = max(ans, (int)bitset<16>(bits).count());//矛盾なし: 仮定から最大数を得る
	}
	cout<< ans <<endl;
}