//#define _GLIBCXX_DEBUG
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops,tune-native")
#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
vector<int> g[100001];
int n;
int mp[100001];
//map<pair<int,int>,bool>memo;
//bool is_tl(){
//    double time=(1.0*clock()/CLOCKS_PER_SEC);
//    return time>=0.985;
//}
bool used[100001];
bool dfs(int v,int p,int c_ti=1){
  //  if(is_tl()){
  //      puts("NO");
  //      exit(0);
  //  }
    if(c_ti==n){
        for(auto i:g[v]){
            if(i==1){
                mp[1]=v;
                return true;
            }
        }
        return false;
    }
    bool f=0;
    for(auto i:g[v]){
        if(i!=p && !used[i]){
            used[i]=true;
            f|=dfs(i,v,c_ti+1);
            if(f){
                mp[i]=v;
                return true;
            }
            used[i]=false;
        }
    }
    return f;
}
void Bogdan(){
    //const time_t timer=time(NULL);
    int m;
    scanf("%d %d",&n,&m);
    int l,r;
    for(int i=0;i<m;i++){
        scanf("%d %d",&l,&r);
        g[r].push_back(l);
    }
    for(int i=1;i<=n;i++){
        if(!g[i].size()){
           puts("NO\n");
            return;
        }
    }
    bool f=dfs(1,0);
    puts((f?"YES":"NO"));
    if(f){
        int cur=1;
        putchar('1');
        putchar(' ');
        while(mp[cur]!=1){
            printf("%d ",mp[cur]);
            cur=mp[cur];
        }
        puts("1 ");
    }
}
/*
*/
int32_t main(){
    int t=1,n;
   // cin>>t;
    while(t--){
        Bogdan();
    }
}
