#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#define int long long
#define ll long long
#define ff first
#define ss second
#define num ss
#define value ff.ff
#define cntt ff.ss
#define pb push_back
#define m_p make_pair
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
#pragma GCC target("avx,avx2")
using namespace std;
using namespace __gnu_pbds;
#define ordered set tree < int ,  null_type ,  less ,  rb_tree_tag ,  tree_order_statistics_node_update >
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//constexpr int N=2147483647;
//constexpr int INF=2147483647;
//constexpr int BIGINF=1e18;
//constexpr int N=500001;
//constexpr int mod=998244353;
vector<int>in[100001];
vector<int>out[100001];
vector<int>pereb;
int pred[100001];
int nxt[100001];
int n;
bitset<100001>used;
bool perev(int x)
{
    used&=0;
    used[0]=1;
    int cnt=0;
    while(!used[x])
    {
        used[x]=1;
        cnt++;
        x=nxt[x];
    }
    return (cnt==n);
}
bool f=0;
void rec(int pos)
{
    if(f)
    {
        return;
    }
    if(pos==pereb.size())
    {
        if(perev(1))
        {
            f=1;
        }
        return;
    }
    int v = pereb[pos];
    for(int i=0; i<in[v].size(); i++)
    {
        pred[v]=in[v][i];
        for(int j=0; j<out[v].size(); j++)
        {
            nxt[v]=out[v][j];
            rec(pos+1);
            if(f)
            {
                return;
            }
        }
    }
}
void solve()
{
    int m;
    cin>>n>>m;
    if(m<n)
    {
        cout<<"NO";
        return;
    }
    for(int i=0; i<m; i++)
    {
        int a, b;
        cin>>a>>b;
        out[a].pb(b);
        in[b].pb(a);
    }
    for(int i=1; i<=n; i++)
    {
        if(out[i].size()==0 || in[i].size()==0)
        {
            cout<<"NO";
            return;
        }
        if(out[i].size()==1 && in[i].size()==1)
        {
            pred[i]=in[i][0];
            nxt[i]=out[i][0];
        } else
        {
            pereb.pb(i);
        }
    }
//    for(auto  i:pereb)
//    {
//        cout<<i<<" ";
//    }
    rec(0);
    if(!f)
    {
        cout<<"NO";
        return;
    }
    cout<<"YES\n";
    int i=nxt[1];
    cout<<"1 ";
    while(i!=1)
    {
        cout<<i<<" ";
        i=nxt[i];
    }
    cout<<1;
}
main()
{
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios_base::sync_with_stdio(false);
    int t=1;
//    cin>>t;
    while(t)
    {
        t--;
        solve();
    }
}
//5 8
//1 2
//1 3
//1 5
//2 3
//3 4
//4 1
//5 3
//5 2

