#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=2e5+5;
int n,m,u,v;
int du[N];
int cnt,head[N];
struct edge{int next,to;}e[M];
inline void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
int main(){
scanf("%d%d",&n,&m);
for (register int i=1; i<=m; ++i) scanf("%d%d",&u,&v),add(u,v),du[v]++;
cnt=0;
queue<int>q;
for (register int i=1; i<=n; ++i) if (!du[i]) q.push(i),cnt++;
while (!q.empty())
{
int u=q.front(); q.pop();
for (register int i=head[u]; i; i=e[i].next)
{
du[e[i].to]--;
if (!du[e[i].to]) q.push(e[i].to),cnt++;
}
}
printf("%d\n",cnt); // cnt记录不在环上的点
if (cnt==n) puts("YES"); else puts("NO");
return 0;
}