#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXN 10010
#define MAXM 100010
struct Edge{
int v, next;
}edge[MAXM];
int head[MAXN], tot ;
int stack[MAXN], DFN[MAXN], Low[MAXN], Belong[MAXM];
int instack[10010];
int n, m, index, scc, top ;
void init(){
index = 0;
scc = top = tot = 0;
memset(head, -1, sizeof(head));
memset(DFN, 0, sizeof(DFN));
}
void addedge(int u, int v){
edge[tot].v = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Tarjan(int u){
DFN[u] = Low[u] = ++index;
instack[u] = 1;
stack[top++] = u;
for(int e = head[u]; e != -1; e = edge[e].next){
int v = edge[e].v;
if(!DFN[v]){
Tarjan(v);
if(Low[u] > Low[v]) Low[u] = Low[v];
}
else if(instack[v] && DFN[v] < Low[u])
Low[u] = DFN[v];
}
if(DFN[u] == Low[u]){
scc++;
int t ;
do{
t = stack[--top];
instack[t] = 0;
Belong[t] = scc;
}
while(t != u);
}
}
void solve(){
for(int i = 1; i <= n; i++)
if(!DFN[i])
Tarjan(i);
}
int main(){
while(scanf("%d%d",&n,&m) && (n || m)){
init();
while(m--){
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
solve();
if(scc == 1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std ;
const int maxn = 1e4 + 10 ;
const int maxm = 1e5 + 10 ;
struct Edge{
int to , next ;
} edge1[maxm] , edge2[maxm];
int head1[maxn ] , head2[maxn] ;
bool mark1[maxn] , mark2[maxn] ;
int tot1 , tot2 ;
int cnt1 , cnt2 ;
int st[maxn] ;
int belong[maxn] ;
int num ;
int setnum[maxn] ;
void addedge( int u , int v ){
edge1[tot1].to = v ; edge1[tot1].next = head1[u] ; head1[u] = tot1 ++ ;
edge2[tot2].to = u ; edge2[tot2].next = head2[v] ; head2[v] = tot2 ++ ;
}
void dfs1(int u ){
mark1[u] = true ;
for(int i = head1[u] ; i != -1 ; i= edge1[i].next )
if( !mark1[edge1[i].to ])
dfs1( edge1[i].to ) ;
st[cnt1 ++ ] = u ;
}
void dfs2( int u ){
mark2[u] = true ;
num ++ ;
belong [u ] = cnt2 ;
for(int i = head2[u] ; i != -1 ; i = edge2[i].next )
if( !mark2[edge2[i].to])
dfs2( edge2[i].to ) ;
}
void solve( int n ){
memset( mark1 , false , sizeof( mark1 )) ;
memset( mark2 , false , sizeof( mark2 )) ;
cnt1 = cnt2 = 0 ;
for(int i = 1 ; i <= n ;i++)
if( !mark1[i] )
dfs1(i) ;
for(int i = cnt1-1 ; i>= 0 ; i--)
if( !mark2[st[i]]){
num = 0 ;
dfs2( st[i]) ;
setnum[cnt2 ++] = num ;
}
}
int n, m ;
void ini() {
memset( head1 , -1 , sizeof( head1 )) ;
memset( head2 , -1 , sizeof( head2 )) ;
}
int main(){
while(scanf("%d%d",&n,&m) && (n || m)){
ini() ;
while(m--){
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
solve( n );
if(cnt2 == 1) printf("Yes\n");
else printf("No\n");
}
return 0;
}