/*
分析:
果的Tarjan。
考虑了n==0和m==0要特殊处理,但是没有考虑n==1,
囧~~~,1WA。。。
2012-10-24
*/
#include"stdio.h" #include"string.h" #include"stdlib.h" #include"queue" using namespace std; int stack[10011],tot_s,index_s; int instack[10011]; int DFN[10011],LOW[10011]; struct Eage { int from,to; int next; }eage[100111]; int tot,head[10011]; void add(int a,int b) { eage[tot].from=a; eage[tot].to=b; eage[tot].next=head[a]; head[a]=tot++; } int ans; void Tarjan(int k) { int j,v; if(ans) return ; stack[tot_s++]=k; instack[k]=1; DFN[k]=LOW[k]=index_s++; for(j=head[k];j!=-1;j=eage[j].next) { v=eage[j].to; if(instack[v]) LOW[k]=LOW[k]>DFN[v]?DFN[v]:LOW[k]; else { Tarjan(v); if(ans) return ; LOW[k]=LOW[k]=LOW[k]>LOW[v]?LOW[v]:LOW[k]; } } if(DFN[k]==LOW[k]) { do { ans++; instack[stack[--tot_s]]=0; }while(stack[tot_s]!=k); } } int main() { int n,m; int i; int a,b; while(scanf("%d%d",&n,&m),n||m) { tot=0; memset(head,-1,sizeof(head)); while(m--) {scanf("%d%d",&a,&b);add(a,b);} if(n<=1) {printf("Yes\n");continue;} if(m==0) {printf("No\n");continue;} tot_s=0; index_s=1; memset(instack,0,sizeof(instack)); memset(DFN,-1,sizeof(DFN)); memset(LOW,-1,sizeof(LOW)); ans=0; Tarjan(1); if(ans==n) printf("Yes\n"); else printf("No\n"); } return 0; }