//Tarjan算法模板题,求出强连通分量,如果是1,所有的房间两两相连
#include<stdio.h> #include<stack> using namespace std; int n,m,dfs[100001],low[100002],ins[100002]; struct edge { int ed; struct edge *next; }*p[100002]; void add(int x,int y) { edge *q=new edge; q->ed=y; q->next=p[x]; p[x]=q; } int ans,idx; stack<int>Q; void Tarjan(int x) { int v; dfs[x]=low[x]=idx++; Q.push(x); ins[x]=1; for( edge *j=p[x];j;j=j->next) { if(dfs[j->ed]==-1) { Tarjan(j->ed); low[x]=low[x]>low[j->ed]?low[j->ed]:low[x]; } else if(ins[j->ed]==1) low[x]=low[x]>dfs[j->ed]?dfs[j->ed]:low[x]; } if(low[x]==dfs[x]) { while(1) { v=Q.top(); Q.pop(); ins[v]=0; if(v==x)break; } ans++; } } int main() { int i,x,y; while(scanf("%d%d",&n,&m),m||n) { for(i=0;i<=n;i++) { p[i]=NULL; dfs[i]=-1; ins[i]=0; } for(i=0;i<m;i++) { scanf("%d%d",&x,&y); add(x,y); } if(n<=1) {printf("Yes\n");continue;} if(m==0) {printf("No\n");continue;} ans=0;idx=0; for(i=1;i<=n;i++) if(dfs[i]==-1) Tarjan(i); if(ans==1) printf("Yes\n"); else printf("No\n"); } return 0; }