#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using ll = long long;

/*
无环有向图
C++ 在竞赛中,1 秒约能处理 10e8 次简单操作(如加减、赋值、遍历)
这份模板采用的 Kahn 算法是拓扑排序的最优时间复杂度算法,整体时间复杂度为:O(n+m)其中:

n:图的节点数量    ( 节点数 n:10e5 ~ 2×10e5 )
m:图的有向边数量  ( 边数 m :10e6 ~ 2×10e6 )

复杂度拆解(对应代码步骤):

初始化队列:遍历所有节点检查入度是否为 0,耗时 O(n);
核心循环:每个节点只会入队、出队一次(总共 O(n)),每条边只会被遍历一次(遍历邻接表时处理 u→v 的边,总共 O(m));
输入 / 输出:读入 m 条边、输出拓扑序,耗时也为 O(n+m),属于算法整体复杂度的一部分。

关键结论:Kahn 算法是线性时间复杂度,没有更优的拓扑排序算法(因为任何拓扑排序都至少需要遍历所有节点和边,无法低于O(n+m)),完全适配 ICPC 对算法效率的要求。
*/

// 核心:Kahn算法实现拓扑排序,返回是否存在合法拓扑序,拓扑序存储在res中
// 参数说明:n-节点总数(节点编号建议从1开始,适配竞赛输入习惯),adj-邻接表,in-入度数组,res-存储拓扑序的结果数组
bool topologicalSort(ll n, vector<vector<ll>>& adj, vector<ll>& in, vector<ll>& res) {
    // 步骤1:初始化队列,将所有入度为0的节点入队(拓扑序的起点)
    //用小顶堆替代普通队列,每次选入度为0的节点中编号最小的
    priority_queue<ll, vector<ll>, greater<ll>> q;
    for (ll i = 1; i <= n; ++i) {
        if (in[i] == 0) {
            q.push(i);
        }
    }

    // 步骤2:核心拓扑排序循环
    while (!q.empty()) {
        // 步骤2.1:取出队首节点u,加入拓扑序结果
        ll u = q.top(); // 取堆顶(当前最小的入度为0的节点)
        q.pop();
        res.push_back(u);//记录到当前拓扑序中

        // 步骤2.2:遍历u的所有邻接节点v(u->v的边)
        for (ll v : adj[u]) {
            // 步骤2.3:将v的入度减1(因为u已被处理,v的一个前置依赖被消除)
            in[v]--;
            // 步骤2.4:若v的入度变为0,说明v的所有前置依赖已处理完,入队等待处理
            if (in[v] == 0) {
                q.push(v);
            }
        }
    }

    // 步骤3:判断是否存在环(拓扑序长度等于节点总数则无环,否则有环)
    // 若res.size() < n,说明有节点无法被纳入拓扑序,图中存在环,拓扑排序失败
    return res.size() == n;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    // 竞赛输入示例:先读入节点数n和边数m
    ll n, m;
    cin >> n >> m;

    // 初始化邻接表(节点编号1~n,所以大小为n+1)
    vector<vector<ll>> adj(n + 1);
    // 初始化入度数组(初始全为0)
    vector<ll> in(n + 1, 0);
    // 存储拓扑序的结果数组
    vector<ll> res;

    // 步骤4:读入m条有向边,构建邻接表并统计入度
    for (ll i = 0; i < m; ++i) {
        ll u, v;
        cin >> u >> v; // 有向边u->v,表示u是v的前置条件
        adj[u].push_back(v); // 邻接表中u的邻接节点添加v
        in[v]++; // v的入度加1(因为多了一个前置节点u)
    }

    // 步骤5:执行拓扑排序
    if (topologicalSort(n, adj, in, res)) {
        // 输出拓扑序(竞赛中按题目要求格式输出)
        for (ll i = 0; i < res.size(); ++i) {
            if (i > 0) cout << " ";
            cout << res[i];
        }
        cout << endl;
    }
    else {
        // 存在环,无合法拓扑序(竞赛中按题目要求输出,如-1或"cycle")
        cout << -1;
    }

    return 0;
}