#include <bits/stdc++.h>
using namespace std;
#define in_range(x,y,z) for(int x=y; x<z; x++)
int main()
{
int m,n;
cin >> n >> m;
vector < vector<int> > g(n); // граф
int s=0; // начальная вершина
in_range(i,0,m) // считывание графа
{
int u,v;
cin >> u >> v;
g[u-1].push_back(v-1);
g[v-1].push_back(u-1);
}
queue<int> q; // очередь с вершинами, которые мы рассматриваем на данном этапе
q.push (s);
vector<bool> used (n); // логический массив, указывающий, посещена ли вершина
used[s] = true;
while (!q.empty()) // пока мы не обойдем все вершины, которые можно достигнуть из данной
{
int v = q.front();
q.pop(); // достаем из очереди одну вершину
for (size_t i=0; i<g[v].size(); ++i) //просмотрим все ребра, исходящие из данной вершины
{
int to = g[v][i];
if (!used[to]) //если текущая вершина еще не была посещена
{
used[to] = true; //отимечаем, что мы ее посетили
q.push (to); // помещаем в очередь
}
}
}
vector<bool>::iterator it;
it = find (used.begin(), used.end(), false); // проверяем, остались ли еще непосещенные вершины
if (it == used.end()) cout << "YES"; // если все вершины, посещены, то граф связный
else cout << "NO";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGluX3JhbmdlKHgseSx6KSBmb3IoaW50IHg9eTsgeDx6OyB4KyspCgppbnQgbWFpbigpCnsKICBpbnQgbSxuOwogIGNpbiA+PiBuID4+IG07CiAgdmVjdG9yIDwgdmVjdG9yPGludD4gPiBnKG4pOyAvLyDQs9GA0LDRhAogIGludCBzPTA7IC8vINC90LDRh9Cw0LvRjNC90LDRjyDQstC10YDRiNC40L3QsAogIGluX3JhbmdlKGksMCxtKSAvLyDRgdGH0LjRgtGL0LLQsNC90LjQtSDQs9GA0LDRhNCwCiAgewogICAgaW50IHUsdjsKICAgIGNpbiA+PiB1ID4+IHY7CiAgICBnW3UtMV0ucHVzaF9iYWNrKHYtMSk7CiAgICBnW3YtMV0ucHVzaF9iYWNrKHUtMSk7CiAgfQogIHF1ZXVlPGludD4gcTsgLy8g0L7Rh9C10YDQtdC00Ywg0YEg0LLQtdGA0YjQuNC90LDQvNC4LCDQutC+0YLQvtGA0YvQtSDQvNGLINGA0LDRgdGB0LzQsNGC0YDQuNCy0LDQtdC8INC90LAg0LTQsNC90L3QvtC8INGN0YLQsNC/0LUKICBxLnB1c2ggKHMpOwogIHZlY3Rvcjxib29sPiB1c2VkIChuKTsgLy8g0LvQvtCz0LjRh9C10YHQutC40Lkg0LzQsNGB0YHQuNCyLCDRg9C60LDQt9GL0LLQsNGO0YnQuNC5LCDQv9C+0YHQtdGJ0LXQvdCwINC70Lgg0LLQtdGA0YjQuNC90LAKICB1c2VkW3NdID0gdHJ1ZTsKICB3aGlsZSAoIXEuZW1wdHkoKSkgLy8g0L/QvtC60LAg0LzRiyDQvdC1INC+0LHQvtC50LTQtdC8INCy0YHQtSDQstC10YDRiNC40L3Riywg0LrQvtGC0L7RgNGL0LUg0LzQvtC20L3QviDQtNC+0YHRgtC40LPQvdGD0YLRjCDQuNC3INC00LDQvdC90L7QuQogICAgewogICAgICBpbnQgdiA9IHEuZnJvbnQoKTsKICAgICAgcS5wb3AoKTsgLy8g0LTQvtGB0YLQsNC10Lwg0LjQtyDQvtGH0LXRgNC10LTQuCDQvtC00L3RgyDQstC10YDRiNC40L3RgwogICAgICBmb3IgKHNpemVfdCBpPTA7IGk8Z1t2XS5zaXplKCk7ICsraSkgLy/Qv9GA0L7RgdC80L7RgtGA0LjQvCDQstGB0LUg0YDQtdCx0YDQsCwg0LjRgdGF0L7QtNGP0YnQuNC1INC40Lcg0LTQsNC90L3QvtC5INCy0LXRgNGI0LjQvdGLCiAgICAgICAgewogICAgICAgICAgaW50IHRvID0gZ1t2XVtpXTsKICAgICAgICAgIGlmICghdXNlZFt0b10pIC8v0LXRgdC70Lgg0YLQtdC60YPRidCw0Y8g0LLQtdGA0YjQuNC90LAg0LXRidC1INC90LUg0LHRi9C70LAg0L/QvtGB0LXRidC10L3QsAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdXNlZFt0b10gPSB0cnVlOyAvL9C+0YLQuNC80LXRh9Cw0LXQvCwg0YfRgtC+INC80Ysg0LXQtSDQv9C+0YHQtdGC0LjQu9C4CiAgICAgICAgICAgICAgcS5wdXNoICh0byk7IC8vINC/0L7QvNC10YnQsNC10Lwg0LIg0L7Rh9C10YDQtdC00YwKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICB2ZWN0b3I8Ym9vbD46Oml0ZXJhdG9yIGl0OwogIGl0ID0gZmluZCAodXNlZC5iZWdpbigpLCB1c2VkLmVuZCgpLCBmYWxzZSk7IC8vINC/0YDQvtCy0LXRgNGP0LXQvCwg0L7RgdGC0LDQu9C40YHRjCDQu9C4INC10YnQtSDQvdC10L/QvtGB0LXRidC10L3QvdGL0LUg0LLQtdGA0YjQuNC90YsKICBpZiAoaXQgPT0gdXNlZC5lbmQoKSkgY291dCA8PCAiWUVTIjsgLy8g0LXRgdC70Lgg0LLRgdC1INCy0LXRgNGI0LjQvdGLLCDQv9C+0YHQtdGJ0LXQvdGLLCDRgtC+INCz0YDQsNGEINGB0LLRj9C30L3Ri9C5CiAgZWxzZSBjb3V0IDw8ICJOTyI7CiAgcmV0dXJuIDA7Cn0K