#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=1005;
bool visited[N]={false};
int n,m,a,b,cont;
vector<int> vec[N]; //vec[1]中存储与顶点1相邻的所有顶点
void Initial(){
   cont=0;
   for(int i=0;i<=1000;i++) vec[i].clear();
   for(int i=1;i<=1000;i++) visited[i]=false;
}
void BFS(int u){
    queue<int> q;
    q.push(u);
    visited[u]=true;
    while(!q.empty()){
        u=q.front();
        q.pop();
        //查找u结点的邻接结点
        for(int i=0;i<vec[u].size();i++){
            int v=vec[u][i];
            if(visited[v]==false){
                q.push(v);
                visited[v]=true;
            }
        }
    }
}
void BFSTraverse(){
    for(int i=1;i<=n;i++){
        if(visited[i]==false){
            cont++;
            BFS(i);
        }
    }
}
int main() {
    while(cin>>n>>m){
        if(n==0 && m==0) break;
        Initial();
        for(int i=0;i<m;i++){
            cin>>a>>b;
            vec[a].push_back(b);
            vec[b].push_back(a);
        }
        BFSTraverse();
        if(cont==1) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}