#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <cstdio>
using namespace std;
#define maxn 5010

vector <int> adj[maxn], qq;
set <int> s;
int edge[maxn][maxn], mark[maxn], deg[maxn], del[maxn], n, tot;

void reset(){
	for (int i=1; i<=n; i++){
		mark[i]= 0;
		deg[i]= adj[i].size();
		del[i]= 0;
	}   
}


void fill(){
	for (int i=1; i<=n; i++) mark[i]= 0;
	for (int i=0; i<qq.size(); i++) mark[qq[i]]= 1;
}

int findans(){
	int ans= 0, sz= qq.size();
	if (sz<n and sz) ans++;
	reset();
	fill();
	for (int i=1; i<=n; i++){
		for (int j=0; j<adj[i].size(); j++){
			if (mark[adj[i][j]]) deg[i]--;
		}
	}
	for (int i=1; i<=n; i++){
		if (!mark[i] and adj[i].size()==sz-1){
			for (int j=1; j<=n; j++){
				if (!mark[j] or edge[i][j] or i==j) continue;
				if (!deg[j]) ans++;
				break;
			}	
		} 
		if (mark[i] and !deg[i] and sz>1) ans++;
	}
	return ans;
}


bool isvalid(){
	int sum= 0, sz= qq.size();
	for (int i=0; i<qq.size(); i++) sum+=adj[qq[i]].size();
	return (sum==tot+sz*(sz-1)/2);
	
}

bool check (int sz){
	s.clear();
	reset();
	for (int i=1; i<=n; i++){
		if (deg[i]<sz-1) {
			s.insert(i);
			del[i]= 1;
		}
	}
	int p, q, cnt= 0;
	while (!s.empty()){
		p= *s.begin();
		s.erase(s.begin());
		for (int i=0; i<adj[p].size(); i++){
			q= adj[p][i];
			deg[q]--;
			if (deg[q]<sz-1 and !del[q]) {
				s.insert(q);
				del[q]= 1;
			}
		}
	}
	for (int i=1; i<=n; i++){
		if (!del[i] and deg[i]>=sz) cnt++;
	}
	return (cnt>sz);
}


int main() {
	int k, x, sz= 0, cnt= 0, p, q, temp;
	scanf("%d", &n);
	for (int i=1; i<=n; i++){
		scanf("%d", &k);
		tot+=k;
		while (k--){
			scanf("%d", &x);
			adj[i].push_back(x);
			edge[i][x]= 1;
		}
	}
	tot/=2;
	for (int i= 20; i>=0; i--){
		temp= sz+(1<<i);
		if (temp>=n) continue;
		if (check(temp)) sz= temp;
	} 
	sz++;
	s.clear();
	reset();
	for (int i=1; i<=n; i++){
		if (deg[i]<sz-1) {
			s.insert(i);
			del[i]= 1;
		}
	}

	while (!s.empty()){
		p= *s.begin();
		s.erase(s.begin());
		for (int i=0; i<adj[p].size(); i++){
			q= adj[p][i];
			deg[q]--;
			if (deg[q]<sz-1 and !del[q]) {
				s.insert(q);
				del[q]= 1;
			}
		}
	}
	for (int i=1; i<=n; i++){
		if (!del[i] and deg[i]>=sz){
			cnt++;
			qq.push_back(i);
		} 
	}
	if (cnt==sz){
		if (!isvalid()){
			printf("0 \n");
			return 0;
		}
		printf("%d \n", findans());
		return 0;
	}
	for (int i=1; i<=n; i++){
		if (del[i] or deg[i]>=sz) continue;
		qq.clear();
		for (int j=0; j<adj[i].size(); j++){
			if (!del[adj[i][j]]) qq.push_back(adj[i][j]);
		}
		qq.push_back(i);
		if (!isvalid()) continue;
		printf("%d \n", findans());
		return 0;
	}
	printf("0 \n");
	return 0;
	
	
}