有向图,经过dfs1后可当 无向图操作
//强连通分量:任意两点之间互相连通
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+5;
int T,n,m,cnt[2],t,head[2][maxn],vis[maxn],p[maxn],f[maxn];
ll res[maxn];
struct E{
int to,nex;
}e[2][10*maxn];
int add(int u,int v,int flag){
e[flag][++cnt[flag]].to=v;
e[flag][cnt[flag]].nex=head[flag][u];
head[flag][u]=cnt[flag];
}
int dfs1(int x){
vis[x]=1;
for(int k=head[1][x];k;k=e[1][k].nex){
int v=e[1][k].to;
if(!vis[v]) dfs1(v);
}
p[++t]=x;
}
int dfs2(int x,int y){
vis[x]=0;f[x]=y;
for(int k=head[0][x];k;k=e[0][k].nex){
int v=e[0][k].to;
if(vis[v]) dfs2(v,y);
}
}
//dfs1和2 是一正一反图即可,不一定dfs2反1正
int main(){
int u,v,i;
ll ans;
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
memset(head,0,sizeof(head));//head初始为0 是为了与后面k一致。若初始化为-1则k!=-1
memset(res,0,sizeof(res));
//vis不用重置 dfs2结束后又都为0了
cnt[0]=cnt[1]=0;
//add正反图时 cnt都得从0开始,所以也要用0,1分别存。不能公用一个
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
add(u,v,0);
add(v,u,1);//反图
}
for(t=0,i=1;i<=n;i++){
if(!vis[i]) dfs1(i);
}
//通过dfs1求出p数组 给dfs2遍历
int ans=0;
for(i=n;i>0;i--){
if(vis[p[i]]){
dfs2(p[i],p[i]);
ans++;
}
}
if(ans==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}