#include <iostream>
#include <vector>
#include <queue>

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int n,m;
  std::cin >> n >> m;

  std::vector<std::vector<int>> adj(n+1);//邻接表
  std::vector<int> in(n+1);//入度
  for(int i = 0; i < m; i++){
    int u,v;
    std::cin >> u >> v;

    adj[u].push_back(v);//建有向边u->v
    in[v]++;//v的入度+1
  }

  std::vector<int> ans;//拓扑序

  auto topoSort = [&](){
    std::queue<int> q;

    for(int i = 1; i <= n; i++){
      if(in[i] == 0){//入度为0的入队
        q.push(i);
      }
    }

    while(q.size()){
      auto u = q.front();
      q.pop();
      ans.push_back(u);//节点出队时记录,也可放在入队时统计

      for(auto v:adj[u]){
        if(--in[v] == 0){//如果删去当前u->v的边使得v入度为0,那么v也入队列
          q.push(v);
        }
      }
    }
  };

  topoSort();

  if(ans.size() != n){//拓扑排序失败即拓扑序数组大小不等于n(<n),输出"-1"并return
    std::cout << "-1\n";
    return 0;
  }

  for(int i = 0; i < ans.size(); i++){//拓扑排序成功输出拓扑序
    std::cout << ans[i] << " \n"[i+1==ans.size()];
  }
}