#include <cstddef>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define Max 200005
struct arcNode {
int arc;
arcNode* next;
};
struct vexNode {
arcNode* frist;
};
int main() {
vector<vexNode> vex;
vector<int> t1, t2;
int n, m;
cin >> n;
cin >> m;
//输入数据
for (int i = 0; i < m; i++) {
int a, b;
cin >> a;
cin >> b;
t1.push_back(a);
t2.push_back(b);
}
//初始化邻接表,并将数据放入
for (int i = 0; i < n; i++) {
vexNode temp;
//由于指针访问不对劲,放弃第一个节点
temp.frist = new arcNode();
temp.frist->arc=-1;
temp.frist->next=NULL;
vex.push_back(temp);
}
for (int i = 0; i < m; i++) {
arcNode* temp = new arcNode();
temp->arc = t2[i] - 1;
temp->next = NULL;
arcNode* p = vex[t1[i] - 1].frist;
while (p->next) {
p = p->next;
}
p->next = temp;
}
// 存放入度为0的节点的队列
queue<int> que;
// 存放每一个节点的入度,先进行初始化
vector<int> du;
for (int i = 0; i < n; i++) {
du.push_back(0);
}
//计算当前顶点的入度
for (int i = 0; i < n; i++) {
du.push_back(0);
arcNode* p = vex[i].frist;
p = p->next;
while (p) {
du[p->arc]++;
p = p->next;
}
}
//将入度为0的顶点入队
for (int j = 0; j < n; j++) if (du[j] == 0) que.push(j);
// 存放可能要输出的顶点数目
vector<int> aout;
// 将入度为0顶点移除,并计算剩余顶点的入度
while (!que.empty()) {
int i = que.front();
que.pop();
aout.push_back(i);
arcNode* p = vex[i].frist;
p = p->next;
while (p) {
if (--du[p->arc] == 0) que.push(p->arc);
p = p->next;
}
}
// 判断处理后,入度为0的顶点是否是全部顶点,如果不是说明存在环
if (aout.size() < n) cout << "-1" << endl;
else {
cout << aout[0] + 1;
for (int i = 1; i < n; i++) {
cout << " " << aout[i] + 1;
}
cout << endl;
}
return 0;
}