/*
分析:
果的Tarjan。
考虑了n==0和m==0要特殊处理,但是没有考虑n==1,
囧~~~,1WA。。。
2012-10-24
*/
分析:
果的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;
}