#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

#define rep(i,j) REP((i), 0, (j))
#define REP(i,j,k) for(int i=(j);(i)<(k);++i)
#define BW(a,x,b) ((a)<=(x)&&(x)<=(b))
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(), (c).end()

#define F first
#define S second
#define INF 1 << 30

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;
typedef int Weight;
struct Edge{
  int src, dst;
  Weight weight;
  Edge(int src, int dst, Weight weight):
    src(src), dst(dst), weight(weight){}
};

bool operator<(const Edge &e, const Edge &f){
  return e.weight != f.weight ? e.weight > f.weight :
    e.src != f.src ? e.src > f.src : e.dst > f.dst;
}

typedef vector<Edge> Edges;
typedef vector<Edges> Graph;

typedef vector<Weight> Array;
typedef vector<Array> Matrix;

bool visit(const Graph &g, int v, vector<int> &order, vector<int> &color){
  color[v] = 1;
  FOR(e, g[v]){
    if(color[e->dst] == 2) continue;
    if(color[e->dst] == 1) return false;
    if(!visit(g, e->dst, order, color)) return false;
  }
  order.push_back(v); color[v] = 2;
  return true;
}

bool topologicalSort(const Graph &g, vector<int> &order){
  int n = g.size();
  vector<int> color(n);
  rep(u, n) if(!color[u] && !visit(g, u, order, color))
    return false;
  reverse(ALL(order));
  return true;
}


int main(){
  int m, n, x, y;
  scanf("%d%d", &m, &n);
  Graph g(m);

  rep(i, n){
    scanf("%d%d", &x, &y); x--; y--;
    g[x].push_back(Edge(x, y, 1));
  }

  vector<int> res;
  if(topologicalSort(g, res)){
    rep(i, res.size())
      printf("%d\n", res[i]+1);
  }

  return 0;
}