#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
private:
vector<vector<int>> Graph;
vector<int> visited;
bool valid;
public:
vector<int> topoSort;
Solution(int n, vector<vector<int>>& edges)
{
Graph.resize(n+1);//结点个数
visited.resize(n+1,0);
valid = true;//默认存在合法的拓扑排序,也就是说该图是无环的有向图
for(const auto& edge : edges)
{//根据输入的边来建立有向图
Graph[edge[0]].push_back(edge[1]);
}
}
//通过深度优先搜索获得逆序的拓扑排序
void dfs(int node)
{
if(!valid)
{//假如已经得到该图有环,则直接return
return;
}
visited[node] = 1;
for(int neighbor : Graph[node])
{//遍历结点node的所有邻居
if(visited[neighbor] == 1)
{//如果已经访问过邻居,说明该图有环
valid = false;
return;
}
if(visited[neighbor] == 0)
{//如果没访问过邻居,说明该图可能无环
dfs(neighbor);
}
}
visited[node] = 2;//标记为已访问,防止重复访问
topoSort.push_back(node);
}
void topoSorting()
{
for(int i = 1;i < Graph.size();++i)
{//对所有未访问过的结点进行dfs
if(visited[i] == 0)
{
dfs(i);
}
}
if(!valid)
{
cout << -1 << endl;
return;
}
reverse(topoSort.begin(), topoSort.end());
for(int i = 0;i < topoSort.size()-1;++i)
{//注意题目要求最后一个数字后面不能带空格!!! 我开始的时候没看到,来回改来改去,以为自己写的有问题,结果是空格的锅,破题目😡
cout << topoSort[i] << " ";
}
cout << topoSort[topoSort.size()-1];
}
};
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> edges(m,vector<int>(2));
for(auto&& edge : edges)
{
cin >> edge[0] >> edge[1];
}
Solution solution(n, edges);
solution.topoSorting();
}