#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef long long LL;
// ==================== 图的链式向前星表示法 ====================
#define N 1010 // 图中顶点的数量
#define M 5010 // 图中边的数量
int cnt_edges;
int head[N];
struct Edge {
int to;
// int weight;
int next;
} edges[M << 1];
void addEdge(int u, int v) {
(edges + cnt_edges)->to = v;
(*(edges + cnt_edges)).next = *(head + u); // 两种写法
*(head + u) = cnt_edges++;
}
void print_graph() {
int i, u;
for (u = 1; u < N; ++u) {
if (*(head + u) == -1) continue;
printf("vertex %d: [", u);
for (i = *(head + u); ~i; i = (edges + i)->next)
printf("%d ", (edges + i)->to);
printf(" ]\n");
}
fputc(10, stdout);
}
// ==================== 图的链式向前星表示法 ====================
LL read(void) {
LL n = 0, sign = 1;
char c = getchar();
while (c < 48 || c > 57) {
if (c == '-') sign = -1;
c = getchar();
}
while (c >= 48 && c <= 57) {
n = (n << 1) + (n << 3) + (c ^ 48);
c = getchar();
}
return sign * n;
}
// DFS 遍历连通分量
void dfs(int curr, int* seen) {
*(seen + curr) = 1;
for (int i = *(head + curr); ~i; i = (edges + i)->next) {
if (*(seen + (edges + i)->to)) continue;
dfs((edges + i)->to, seen);
}
}
// Union Find 找连通分量
// Path Compression
int Find(int* p, int x) {
return *(p + x) = *(p + x) ^ x ? Find(p, *(p + x)) : x;
}
void Union(int* p, int u, int v, int* ccs) {
u = Find(p, u), v = Find(p, v);
if (u == v) return;
*(p + u) = v;
--(*ccs);
}
// 并查集解法
int main(const int argc, const char* const argv[]) {
int n, m, u, v;
while (scanf("%d %d", &n, &m) != EOF) {
int p[n + 1], ccs = n;
for (int i = 0; i <= n; ++i) *(p + i) = i;
while (m--) {
u = read(), v = read();
Union(p, u, v, &ccs);
}
puts(ccs == 1 ? "YES" : "NO");
}
return 0;
}
// DFS解法
int main2(const int argc, const char* const argv[]) {
int n, m, u, v;
while (scanf("%d %d", &n, &m) != EOF) {
memset(head, -1, sizeof head);
cnt_edges = 0;
while (m--) {
u = read(), v = read();
addEdge(u, v); // 竞赛专用
addEdge(v, u);
}
int ccs = 0, seen[n + 1];
memset(seen, 0, sizeof seen);
for (u = 1; u <= n; ++u) {
if (*(seen + u)) continue;
++ccs;
dfs(u, seen);
}
puts(ccs == 1 ? "YES" : "NO");
}
return 0;
}