//题意:给定点集和边集,问是不是所有点在一个强连通内
//思路:纯裸的强连通
#include<iostream>
#include<stack>
using namespace std;
struct Node
{
int dest;
struct Node *next;
}*node[10001],*p;
stack<int>Q;
bool Visited[10001],InStack[10001];
int dfn[10001],low[10001],beNum,nTime;
int N,M;
void AddNode(int st,int end){
p=new struct Node;
p->dest=end;
p->next=node[st];
node[st]=p;
}
void Init()//初始化
{
int i;
for(i=1;i<=N;i++)
node[i]=NULL;
while(!Q.empty())
Q.pop();
memset(Visited,false,sizeof(Visited));
memset(InStack,false,sizeof(InStack));
beNum=nTime=0;
int a,b;
for(i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
AddNode(a,b);
}
}
int min(int ta,int tb)
{
if(ta>tb) return tb;
return ta;
}
void Tarjan(int t)
{
dfn[t]=low[t]=++nTime;
Q.push(t);
Visited[t]=InStack[t]=true;
struct Node *q;
int x;
for(q=node[t];q!=NULL;q=q->next)
{
x=q->dest;
if(!Visited[x])
{
Tarjan(x);
low[t]=min(low[t],low[x]);
}
else if(InStack[x])
low[t]=dfn[x];
}
if(dfn[t]==low[t])
{
beNum++;
do
{
x=Q.top();
Q.pop();
}while(x!=t);
}
}
void doit()
{
int i;
for(i=1;i<=N;i++)
{
if(!Visited[i])
Tarjan(i);
}
if(beNum==1) printf("Yes\n");//如果只有一个强连通子集,则yes
else printf("No\n");
}
int main()
{
while(scanf("%d%d",&N,&M) && (N||M))
{
Init();
doit();
}
return 0;
}