//#define _GLIBCXX_DEBUG
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
#define fast ios_base::sync_with_stdio(false);cout.tie(nullptr);cin.tie(nullptr);
using namespace std;
vector<vector<int>> g;
int t;int n;
vector<pair<int,int>>path;
map<pair<int,int>,bool>memo;
set<int> used;
bool dfs(int v,int p,int c_ti=1){
    //used[v]=true;
   // cout<<v<<endl;
    if(memo.find({v,c_ti})!=memo.end()){
        return memo[{v,c_ti}];
    }
    if(c_ti==n){
        for(auto i:g[v]){
            if(i==1){
                path.push_back({v,1});
                return memo[{v,c_ti}]=true;
            }
        }
        return memo[{v,c_ti}]=false;
    }
    bool f=0;
    for(auto i:g[v]){
        if(i!=p && used.find(i)==used.end()){
            used.insert(i);
            f|=dfs(i,v,c_ti+1);
            if(f){
                path.push_back({v,i});
                return memo[{v,c_ti}]=true;
            }
            else{
                memo[{v,c_ti}]=false;
            }
            used.erase(i);
        }
    }
    return memo[{v,c_ti}]=f;
}
void Bogdan(){
    int m;
    cin>>n>>m;
    g.resize(n+1);
    int l,r;
    set<pair<int,int>> st;
    for(int i=0;i<m;i++){
        cin>>l>>r;
        if(st.find({r,l})==st.end()){
            st.insert({r,l});
        g[r].push_back(l);}
    }
    for(int i=1;i<=n;i++){
        if(!g[i].size()){
            cout<<"NO"<<endl;
            return;
        }
    }
    bool f=dfs(1,0);
    cout<<(f?"YES":"NO")<<endl;
    if(f){
            map<int,int> mp;
        for(auto i:path){
            mp[i.second]=i.first;
        }
        int cur=1;
        cout<<1<<' ';
        while(mp[cur]!=1){
            cout<<mp[cur]<<' ';
            cur=mp[cur];
        }
        cout<<1<<endl;
    }
}
/*
*/
int32_t main(){
    fast;
    int t=1,n;
   // cin>>t;
    while(t--){
        Bogdan();
    }
}
