#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <functional>
#include <climits>
#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
const int M = 2e5 + 5;
vector<int>G[N];
stack<int>st;
int du[N][2];
int cnt[2];
int beginn[N];
void DFS(int qi)
{
for (int i = beginn[qi]; i < G[qi].size(); i = beginn[qi])
{
beginn[qi] = i + 1;
DFS(G[qi][i]);
}
st.push(qi);
}
int main()
{
int n, m;
cin >> n >> m;
int u, v;
for (int i = 0; i < m; i++)
{
cin >> u >> v;
G[u].push_back(v);
du[u][1]++;
du[v][0]++;
}
int qi = 1;
for (int i = 1; i <= n; i++)
{
sort(G[i].begin(), G[i].end());
if (du[i][0] != du[i][1])
{
if (du[i][0] - du[i][1] == 1)
{
cnt[1]++;
}
else if (du[i][1] - du[i][0] == 1)
{
cnt[0]++;
qi = i;
}
else
{
cout << "NO" << endl;
return 0;
}
}
}
if (cnt[0] != 0 && cnt[0] != cnt[1])
{
cout << "NO" << endl;
return 0;
}
if (cnt[0] != 0 && cnt[0] != 1)
{
cout << "NO" << endl;
return 0;
}
DFS(qi);
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
return 0;
}