#include <iostream>

using namespace std;
//给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

int father[1001];
int height[1001];//这个是解决超时的关键点吗?表这棵树的高度.增加这个快一毫秒
bool setCount = true;

void InitSet(int n) {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
        height[i] = 0;
    }
}

int FindFather(int u) {
    if (u == father[u]) {
        return u;
    } else {
        return FindFather(father[u]);
    }
}

void UnionSet(int u, int v) {
    int u_root = FindFather(u);
    int v_root = FindFather(v);
    if (height[u_root] < height[v_root]) {//v_root的高度更高,是根节点。
        father[u_root] = v_root;
    } else if (height[u_root] > height[v_root]) {
        father[v_root] = u_root;
    } else {
        father[v_root] = u_root;
        height[u_root]++;
    }
//    father[v_root] = u_root;
//    height[u_root]++;
}

int main() {
    int n;//顶点数目
    int m;//图中边的数目
//    vector<int> vertax(1001);//0表示未出现过
    while (scanf("%d%d", &n, &m) != EOF) {
        if (0 == n) {
            break;
        }
        setCount = true;
        InitSet(n + 1);
        //输入
        for (int i = 0; i < m; ++i) {
            int a;
            int b;
            scanf("%d%d", &a, &b);
            UnionSet(a, b);
        }
        int root = FindFather(1);
        for (int i = 1; i <= n; ++i) {
            if (FindFather(i) != root) {
                setCount = false;
                break;
            }
        }
        if (!setCount) {
            printf("NO\n");
        } else {
            printf("YES\n");
        }

    }

    return 0;
}