#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
using namespace std;
void dfs(long long n, long long m, long long x, long long& k, set<long long>& used, vector<long long>& vec, long long color, map<long long, unordered_set<long long>> graph, string &ans) {
used.insert(x);
vec[x] = color;
for (auto near: graph[x]) {
if (vec[x] == vec[near]) {
ans = "NO";
}
if (used.count(near) == 0) {
if (color == 0) {
dfs(n, m, near, k, used, vec, 1, graph, ans);
}
else {
dfs(n, m, x, near, used, vec, 0, graph, ans);
}
}
}
}
int main()
{
long long n, m, r, c, k = 0, u, v, color = 0;
cin >> n >> m;
map<long long, unordered_set<long long>> graph;
string ans = "YES";
vector<long long> vec(n, -1);
for (int i = 0; i < m; i++) {
cin >> u >> v;
graph[u - 1].insert(v - 1);
graph[v - 1].insert(u - 1);
}
set<long long> used;
dfs(n, m, 0, k, used, vec, color, graph, ans);
cout << ans;
return 0;
}