#include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second template inline bool chmax(A &a, B b) { if (a inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; } typedef long long ll; typedef pair pii; typedef pair pll; typedef pair plp; const ll INF = 1e9+100; const ll MOD = 1e9+7; const double EPS = 1e-10; const bool debug = 0; //--------------------------------// struct UnionFind { vector par, rank; UnionFind(int n) { par.resize(n); rank.resize(n); REP(i, n) { par[i] = i; rank[i] = 0; } } int operator[] (int x) { return find(x); } int find(int x) { if (x == par[x]) return x; return par[x] = find(par[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (rank[x] < rank[y]) swap(x, y); par[y] = x; if (rank[x] == rank[y]) rank[x]++; } bool same(int x, int y) { return find(x) == find(y); } }; int n, m; int a[250000], b[250000]; int cnt[50000]; int main() { cin >> n >> m; UnionFind uf(n); REP(i, m) { scanf("%d %d", a + i, b + i); cnt[a[i]]++; cnt[b[i]]++; uf.unite(a[i], b[i]); } int odd = 0; REP(i, n) { if (cnt[i] & 1) odd++; } bool ans = true; if (odd > 2 || odd == 1) ans = false; set ss; REP(i, m) { ss.insert(uf[a[i]]); ss.insert(uf[b[i]]); } if (ss.size() != 1) ans = false; puts(ans ? "YES" : "NO"); return 0; }