#include<bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define vi vector<int>
#define vll vector<ll>
#define vip vector<pair<int,int>>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define fs(n) fixed<<setprecision(n)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define ci(vector,n) for(int i=0; i<n; i++)cin>>vector[i]
#define ci1(vector,n) for(int i=1; i<=n; i++)cin>>vector[i]
#define ll long long
const long long mod = 1e9 + 7;
const long long mod2 = 998244353;
int rr[] = { 1,1,1,-1,-1,-1,0,0 };
int cc[] = { 1,-1,0,1,-1,0,1,-1 };
void fast() {
std::ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
}
struct point {
int x, y;
}typedef* p;
vector<bool>vis(10003);
void dfs (int start,vector<vi>&adj)
{
//1=componet
vis[start]=1;
for (int i = 0; i <adj[start].size(); ++i) {
if(!vis[adj[start][i]])
dfs(adj[start][i],adj);
}
}
void solve() {
int n,m,u,v;
cin>>n>>m;
vector<vi>adj(n);
vi nods;
for (int i = 0; i <m; ++i) {
cin>>u>>v;
u--,v--;
adj[u].push_back(v);
// adj[v].push_back(u);
nods.push_back(u);
// nods.push_back(v);
}
int c=0;
for (auto it:nods) {
if(!vis[it])
{
c++;
dfs(it,adj);
}
}
if(c>1||n-1!=m)
cout<<"NO\n";
else
{
cout<<"YES\n";
}
}
int main() {
//freopen("two2.in","r",stdin);
//freopen("engy.txt","w",stdout);
fast();
int t = 1;
// cin >> t;
while (t--)
solve();
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2bGwgdmVjdG9yPGxsPgojZGVmaW5lIHZpcCAgdmVjdG9yPHBhaXI8aW50LGludD4+CiNkZWZpbmUgb3JkZXJlZF9zZXQgdHJlZTxpbnQsIG51bGxfdHlwZSxsZXNzPGludD4sIHJiX3RyZWVfdGFnLHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4KI2RlZmluZSBmcyhuKSBmaXhlZDw8c2V0cHJlY2lzaW9uKG4pCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgcmFsbCh2KSB2LnJiZWdpbigpLHYucmVuZCgpCiNkZWZpbmUgY2kodmVjdG9yLG4pIGZvcihpbnQgaT0wOyBpPG47IGkrKyljaW4+PnZlY3RvcltpXQojZGVmaW5lIGNpMSh2ZWN0b3IsbikgZm9yKGludCBpPTE7IGk8PW47IGkrKyljaW4+PnZlY3RvcltpXQojZGVmaW5lIGxsIGxvbmcgbG9uZwpjb25zdCBsb25nIGxvbmcgbW9kID0gMWU5ICsgNzsKY29uc3QgbG9uZyBsb25nIG1vZDIgPSA5OTgyNDQzNTM7CmludCBycltdID0geyAxLDEsMSwtMSwtMSwtMSwwLDAgfTsKaW50IGNjW10gPSB7IDEsLTEsMCwxLC0xLDAsMSwtMSB9Owp2b2lkIGZhc3QoKSB7CiAgICBzdGQ6Omlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKE5VTEwpOwogICAgY291dC50aWUoTlVMTCk7Cn0Kc3RydWN0IHBvaW50IHsKICAgIGludCB4LCB5Owp9dHlwZWRlZiogcDsKdmVjdG9yPGJvb2w+dmlzKDEwMDAzKTsKdm9pZCAgZGZzIChpbnQgc3RhcnQsdmVjdG9yPHZpPiZhZGopCnsKICAgIC8vMT1jb21wb25ldAogICAgdmlzW3N0YXJ0XT0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPGFkaltzdGFydF0uc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZighdmlzW2FkaltzdGFydF1baV1dKQogICAgICAgICAgICBkZnMoYWRqW3N0YXJ0XVtpXSxhZGopOwogICAgfQp9CnZvaWQgc29sdmUoKSB7CiAgICBpbnQgbixtLHUsdjsKICAgIGNpbj4+bj4+bTsKICAgIHZlY3Rvcjx2aT5hZGoobik7CiAgICB2aSBub2RzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPG07ICsraSkgewogICAgICAgIGNpbj4+dT4+djsKICAgICAgICB1LS0sdi0tOwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgLy8gIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICAgICAgbm9kcy5wdXNoX2JhY2sodSk7CiAgICAgICAgLy8gbm9kcy5wdXNoX2JhY2sodik7CiAgICB9CiAgICBpbnQgYz0wOwogICAgZm9yIChhdXRvIGl0Om5vZHMpIHsKICAgICAgICBpZighdmlzW2l0XSkKICAgICAgICB7CiAgICAgICAgICAgIGMrKzsKICAgICAgICAgICAgZGZzKGl0LGFkaik7CiAgICAgICAgfQogICAgfQogICAgaWYoYz4xfHxuLTEhPW0pCiAgICAgICAgY291dDw8Ik5PXG4iOwogICAgZWxzZQogICAgewoKICAgICAgICBjb3V0PDwiWUVTXG4iOwoKICAgIH0KCn0KCmludCBtYWluKCkgewogICAgLy9mcmVvcGVuKCJ0d28yLmluIiwiciIsc3RkaW4pOwogICAgLy9mcmVvcGVuKCJlbmd5LnR4dCIsInciLHN0ZG91dCk7CiAgICBmYXN0KCk7CiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pCiAgICAgICAgc29sdmUoKTsKCn0=