#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<int,int> P;

// グラフ
vector<int> G[21], rG[21];
// memo[v] := 頂点 v を調べたかどうか
bool memo[21] = {false};
// 出次数 0 の頂点(部屋に入ったのが遅い人)
vector<int> leaf;
// d[v] := 出次数 0 の頂点からの距離の最大値
int d[21] = {0};

// 出次数 0 の頂点を列挙する
void dfs(int v){
	if( memo[v] ) return;
	memo[v] = true;
	
	if( G[v].size() == 0 ){
		leaf.push_back(v);
	}else{
		for(int i = 0; i < G[v].size(); i++){
			dfs( G[v][i] );
		}
	}
}

// 出自数 0 の頂点からたどる
void solve(int v, int cost){
	for(int i = 0; i < rG[v].size(); i++){
		int to = rG[v][i];
		if( d[to] < cost + 1 ){
			d[to] = cost + 1;
			solve(to, cost + 1);
		}
	}
}

int main(){
	int n, m;
	cin >> m >> n;
	for(int i = 0; i < n; i++){
		int x, y;
		cin >> x >> y;
		G[x].push_back(y);
		rG[y].push_back(x);
	}
	
	for(int v = 1 ; v <= m; v++){
		dfs(v);
	}
	fill(memo, memo + 21, false);
	for(int i = 0; i < leaf.size(); i++){
		solve(leaf[i], 0);
	}
	
	vector<P> ans;
	for(int i = 1; i <= m; i++){
		ans.push_back( P(d[i], i) );
	}
	sort(ans.rbegin(), ans.rend());
	for(int i = 0; i < ans.size(); i++){
		cout << ans[i].second << endl;
	}
}