#include <bits/stdc++.h>
typedef long long ll;
//#define endl '\n'
using namespace std;
const int N=2000100;
set<int>g[N];
set<int>rg[N];
bool used[N];
vector<int>order;
int timer=0;
vector<int>group[N];
int nxt[N];

void dfs(int v,int s,int need){
    if (v==s && need==0){
        cout<<"YES\n";
        vector<int>ans;
        for (int i:order){
            for (int j:group[i]) ans.push_back(j);
        }
        int pos=-1;
        for (int i=0;i<ans.size();i++){
            if (ans[i]==1) pos=i;
        }
        for (int j=0;j<=ans.size();j++) cout<<ans[(j+pos)%ans.size()]<<" ";
        cout<<endl;
        exit(0);
    }
    if (used[v]) return;
    used[v]=true;
    order.push_back(v);
    for (int i:g[v]){
        int to=nxt[i];
        if (!used[to]){
            dfs(to,s,need-1);
        }
    }

    order.pop_back();
    used[v]=false;
}
int in[N];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m;cin>>n>>m;
    for (int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        g[a].insert(b);
        rg[b].insert(a);
    }
    for (int i=1;i<=n;i++){
        if (g[i].empty() || rg[i].empty()){
            cout<<"NO\n";
            return 0;
        }
    }
    vector<pair<int,int> >E;
    set<pair<int,int> >st;
    for (int i=1;i<=n;i++){
        st.insert({g[i].size(),i});
        st.insert({(int)rg[i].size(),-i});
    }
    while (!st.empty()){
//        for (auto cur:st) cout<<cur.first<<" "<<cur.second<<endl;
//        for (int i=1;i<=n;i++){
//            if (!rg[i].empty()) cout<<"E "<<i<<" "<<(*rg[i].begin())<<endl;
//        }
        auto cur=(*st.begin());
        if (cur.first==0){
            cout<<"NO\n";
            return 0;
        }
        st.erase(st.begin());
        if (cur.first>1) break;
        int v=abs(cur.second);
        if (cur.second<0){
            int del=*rg[v].begin();
            nxt[del]=v;
            st.erase({g[del].size(),del});
//            cout<<"DEL "<<-v<<" "<<del<<endl;
            g[del].erase(v);
            for (int to:g[del]){
//                if (del==1) cout<<"AAAA "<<to<<endl;
                st.erase({rg[to].size(),-to});
                rg[to].erase(del);
                st.insert({rg[to].size(),-to});
            }

        } else {
            int del=*g[v].begin();
            nxt[v]=del;
            st.erase({rg[del].size(),-del});
            rg[del].erase(v);
//            cout<<"DEL "<<v<<" "<<-del<<endl;
            for (int to:rg[del]){
                st.erase({g[to].size(),to});
                g[to].erase(del);
                st.insert({g[to].size(),to});
            }
        }
    }
    for (int i=1;i<=n;i++){
        if (used[i]) continue;
        int x=i;
        vector<int>v;
        while (x>0 && !used[x]){
            v.push_back(x);
            used[x]=true;
            x=nxt[x];
        }
        if (x==i && v.size()==n){
            cout<<"YES\n";
            int cur=1;
            for (int i=1;i<=n+1;i++){
                cout<<cur<<" ";
                cur=nxt[cur];
            }
            cout<<endl;
            return 0;
        }
        if (x){
            cout<<"NO\n";
            return 0;
        }
        x=i;
        while (nxt[x]>0){
            x=nxt[x];
        }
        group[x]=v;
        for (int &j:v) nxt[j]=x;
    }
    return 1;
    dfs(nxt[1],nxt[1],n);
    cout<<"NO\n";

    return 0;
}
