#include #include using namespace std; #define rep(i,n) for(long long i = 0; i < (long long)(n); i++) #define pb push_back using ll = long long; using vll = vector; using vvll = vector; struct UnionFind { vector data; UnionFind(int size) : data(size, -1) { } // x, yをマージ, O(A^-1) bool unite(int x, int y) { x = root(x); y = root(y); if (x != y) { if (data[y] < data[x]) swap(x, y); data[x] += data[y]; data[y] = x; } return x != y; } // x, yが同じ集合なら1, O(A^-1) bool find(int x, int y) { return root(x) == root(y); } // xの根を探す。同じ集合なら同じ根が帰る, O(A^-1) int root(int x) { return data[x] < 0 ? x : data[x] = root(data[x]); } }; int main(void) { ll n, m; cin >> n >> m; assert(n >= 2); assert(n <= 500); assert(m >= 1); assert(m <= n*(n-1)/2); vvll g(n); UnionFind uf(n); set vs; rep(i, m) { ll u, v; cin >> u >> v; assert(0 <= u && u <= n - 1); assert(0 <= v && v <= n - 1); g[u].pb(v); g[v].pb(u); vs.insert(u); vs.insert(v); uf.unite(u, v); } for (auto x : vs) { if (!uf.find(*vs.begin(), x)) { cout << "NO" << endl; return 0; } } ll ret = 0; rep(i, n) ret += g[i].size() & 1; cout << (ret == 0 || ret == 2 ? "YES" : "NO") << endl; return 0; }