#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
//#include "myAlgorithm.h"
#define MAX 40005
#define OFFENCE (1e9 + 5)
#define INF (1e8 + 5)
#define eps 1e-9
#define Rep(s, e) for( int i = s; i <= e; i++)
#define Cep(e, s) for( int i = e; i >= s; i --)
#define PI acos(-1.0)
#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;
/*
tanjar模板题目~,求强连通分量是否为1
*/
int N, M;
int dfn[MAX], low[MAX], v[MAX];
int index, num;
stack<int>s;
vector<vector<int> >adj;
void tanjar(int node){
s.push(node);
dfn[node] = low[node] = ++index;
int len = adj[node].size(), pos;
v[node] = 1;
Rep(0, len - 1){
pos = adj[node][i];
if(!dfn[pos]){
tanjar(pos);
low[node] = min(low[node], low[pos]);
}else if(v[node]){
low[node] = min(low[node], dfn[pos]);
}
}
if(low[node] == dfn[node]){
num++;
while(!s.empty()){
int t = s.top();
s.pop();
v[t] = 0;
if(t == node)
break;
}
}
}
int main(){
while(cin>>N>>M, N + M){
int a, b;
index = num = 0;
adj.assign(N + 1, vector<int>() );
memset(v, 0, sizeof(v));
memset(low, 0, sizeof(low));
memset(dfn, 0, sizeof(dfn));
while(!s.empty()){
s.pop();
}
Rep(1, M){
cin>>a>>b;
adj[a].push_back(b);
}
Rep(1, N){
if(!dfn[i]){
tanjar(i);
}
}
if(num != 1)puts("No");
else puts("Yes");
}
return 0;
}