#include using namespace std; template struct graph { struct edge { int from, to; T cost; }; vector edges; vector> g; int n; graph(int n) : n(n) { g.resize(n); } virtual void add(int from, int to, T cost) = 0; }; template struct undirected_graph : graph { using graph::edges; using graph::g; using graph::n; undirected_graph(int n) : graph(n) { } void add(int from, int to, T cost = 1) { assert(0 <= from && from < n && 0 <= to && to < n); g[from].emplace_back(edges.size()); g[to].emplace_back(edges.size()); edges.push_back({from, to, cost}); } }; int main() { int n, m; cin >> n >> m; undirected_graph g(n); for (int i = 0; i < m; i++) { int from, to; cin >> from >> to; g.add(from, to); } int puni = 0; for (auto &v : g.g) { if (v.size() & 1) { puni++; } } cout << (puni < 3 ? "YES" : "NO") << endl; return 0; }