#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

struct Dsu {
    vector <int> p;
    vector <int> s;
    int n;

    Dsu (int n_) {
        n = n_;
        p = vector <int> (n);
        iota (p.begin (), p.end (), 0);
        s = vector <int> (n, 1);
    }

    int root (int v) {
        if (p[v] == v)
            return v;
        return root (p[v]);
    }

    bool unite (int u, int v) {
        u = root (u);
        v = root (v);
        if (u == v)
            return false;
        if (s[u] > s[v])
            swap (u, v);
        p[u] = v;
        s[v] += s[u];
        return true;
    }
};

int main () {
    int n, m;
    cin >> n >> m;
    Dsu dsu (n);
    int res = n;
    for (int j = 0; j < m; j++) {
        int u, v;
        cin >> u >> v;
        u -= 1;
        v -= 1;
        res -= dsu.unite (u, v);
    }
    cout << ((res == 1) ? "YES" : "NO") << endl;
    return 0;
}
