#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
//#pragma GCC optimize(2) //吸氧
//#pragma GCC optimize(3,"Ofast","inline") //吸臭氧
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
inline int read(){
char ch=getchar();
int x=0,w=1;
while(ch<'0'||ch>'9'){
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*w;
}
int n,id=0,ans=0;
int a[105],head[105],used[105],in[105];
struct node{
int v,next;
}edge[40005];
void add(int u,int v){
edge[++id].v=v;
edge[id].next=head[u];
head[u]=id;
in[v]++;
}
queue<int> q;
int main()
{
n=read();
for(int i=1;i<=n;i++)
used[i]=0;
for(int i=1;i<=n;i++){
int m,y;
a[i]=read();
m=read();
used[a[i]]++;
for(int j=1;j<=m;j++){
y=read();
add(a[i],y);
}
}
for(int i=1;i<=n;i++)
if(!in[a[i]])
q.push(a[i]);
while(!q.empty()){
ans++;
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
in[v]--;
if(!in[v] && used[i]){
used[i]--;
q.push(v);
}
}
}
if(ans==n) cout<<"YES\n";
else cout<<n-ans<<"\n";
return 0;
}