//因为N<=100 所以边数可能<=100*100(每个点和其他99个点相连),边的内存不够,可能会爆栈
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10100
#define MAXM 10001
typedef struct
{
int t_ver, h_ver;
}E_NODE;//用于输入有向边的结构
typedef struct vl_node
{
int ver;
vl_node* link;
}VL_NODE;//用于建立邻接链表,定义链表中的一个结点的结构
typedef struct ch_node
{
int count;
VL_NODE* head;
}CH_NODE;//邻接链表的头节点
E_NODE e[MAXN];
CH_NODE ch[MAXN];
int tpv[MAXN];
int n,m;
void creat_adj_list(int n, int m, E_NODE e[], CH_NODE ch[])
{
//创建邻接链表
int i,u,v;
VL_NODE* p;
for(i = 1 ; i <= n ; i++){
ch[i].count = 0;
ch[i].head = NULL;
}
for(i = 1 ; i <= m ; i++){
u = e[i].t_ver;
v = e[i].h_ver;
p = (VL_NODE*) malloc(sizeof(VL_NODE));
p->ver = v;
p->link = ch[u].head;
ch[u].head = p;
(ch[v].count)++;
}
}
int topol_order(int n)
{
int i,j,k;
int top = 0;
VL_NODE* t;
for(i = 1 ; i <= n ; i++){
if(ch[i].count == 0){
ch[i].count = top;
top = i;
}
}
i = 0;
while(top != 0){
j = top;
top = ch[top].count;
tpv[++i] = j;
t = ch[j].head;
while(t != NULL){
k = t->ver;
if(--(ch[k].count) == 0){
ch[k].count = top;
top = k;
}
t = t->link;
}
}
return i;
}
int main()
{
m = 1;
cin >> n;
for(int i = 1 ; i <= n ; i++){
int count;
cin >> count;
if(!count) continue;
else{
for(int j = 0 ; j < count ; j++){
int tmpVertex;
cin >> tmpVertex;
e[m].t_ver = tmpVertex;
e[m++].h_ver = i;
}
}
}
m--;
creat_adj_list(n,m,e,ch);
cout << (topol_order(n) >= n) << endl;
}