#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;

int n,m;
int a[10000][10000];
int c[100001];
int path[100001];
int v0=2;

void prnt(int n,int m){
    reverse(path, path+n);
    for(int i=0;i<n;i++) path[i]++;
    int d = 0;
    for(int i=0;i<n;i++){
        if(path[i]==1) d=i;
    }
    int path2[100001];
    int g=0;
    for(int i=d;i<n;i++){
        path2[i-d]=path[i];
        g++;
    }
    for(int i=0;i<d;i++){
        path2[i+g]=path[i];
    }
    
    
    cout<<"YES\n";
    int p;
    for ( p = 0 ; p<n ; p++)
        cout<<path2[p]<<" ";
    cout<<path2[0];
    cout<<"\n";
}
 
//программа нахождения гамильтонова цикла
long long gamilton(int k,int n,int m){
    int v,q1=0;
    for(v=0; v<n && !q1; v++){
        if(a[v][path[k-1]]||a[path[k-1]][v]){
            if (k==n &&  v==v0 ) q1=1;
            else if (c[v]==-1){
                c[v] = k; path[k]=v;
                q1=gamilton(k+1,n,m);
                if (!q1) c[v]=-1;
            } else continue;
        }
    }   return q1;
}
 
int main(){
    int v1,v2;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>v1>>v2;
        a[v1-1][v2-1]=1;
        
    }
    
    int j;
    for(j=0;j<n;j++) c[j]=-1;
    path[0]=v0;
    c[v0]=v0;
    if(gamilton (1,n,m)) prnt(n,m);
    else cout<<"NO\n";
    cin.get();
    return 0;
}

