#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define ff first
#define ss second
#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;
vector<int>in[100001];
vector<int>out[100001];
vector<int>pereb;
int pred[100001];
int nxt[100001];
int step[100001];
int cnt[100001];
int s=0, t=0; //s->t
int n;
int used[100001];
bitset<100001>used1;
bool perev(int x)
{
    used1&=0;
    used1[0]=1;
    int cnt=0;
    while(!used1[x])
    {
        used1[x]=1;
        cnt++;
        x=nxt[x];
    }
    for(int i=1; i<=n; i++)
    {
        if(used1[i]==0)
            return false;
    }
    return true;
}
bool f=0;
void dfs(int x)
{
    used[x]=1;
    cnt[x]=0;
    for(auto i:out[x])
    {
        if(!used[i])
        {
            dfs(i);
        }
        if(used[i]==2 && cnt[i]>cnt[x])
        {
            nxt[x]=i;
            cnt[x]=cnt[i]+1;
        }
    }
    used[x]=2;
    cnt[x]++;
}
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;
        }
    }
    dfs(1);
    if(!perev(1))
    {
        cout<<"NO";
        return;
    }
    cout<<"YES\n";
    int i=nxt[1];
    cout<<"1 ";
    while(i!=1 && i>0)
    {
        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
