#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;
}