#include <iostream>
#include <cstdio>
#include <vector>
#include <list>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <numeric>
#include <sstream>
#include <queue>
#include <iomanip>
using namespace std;

#define REP(i,n) for(int (i)=0; (i)<(n); (i)++)
#define FOR(i,a,b) for(int (i)=(a); (i)<(b); (i)++)
#define PUSH(n,v) for(int i=0; i<(n); i++) {int j; cin >> j; v.push_back(j);}
#define ALL(v) v.begin(), v.end()
#define print(s) cout << (s) << endl

class Graph {
private:
    list<int> *adj;
    int V;
    void tSortUtil(int v, bool visited[], vector<int> &w);
public:
    Graph(int n) {
        V = n;
        adj = new list<int>[V];
    }
    void addEdge(int key, int to) {
        adj[key].push_back(to);
    }
    vector<int> tSort();
};

void Graph::tSortUtil(int v, bool visited[], vector<int> &w) {
    visited[v] = true;
    for (auto itr = adj[v].begin(); itr != adj[v].end(); ++itr) {
        if (!visited[*itr]) tSortUtil(*itr, visited, w);
    }
    w.push_back(v);
}

vector<int> Graph::tSort() {
    vector<int> w;
    bool *visited = new bool[V];
    REP(i,V) visited[i] = false;
    REP(i,V) {
        if (visited[i] == false) tSortUtil(i, visited, w);
    }
    reverse(ALL(w));
    return w;
}

int main() {
    int m, n;
    cin >> m >> n;
    Graph graph = Graph(m);
    REP(i,n) {
        int x, y;
        cin >> x >> y;
        graph.addEdge(x-1, y-1);
    }
    vector<int> v = graph.tSort();
    REP(i,m) cout << v[i]+1 << endl;
}