//bài toán:Có n công việc (đánh số từ 1 → n)
//Có m yêu cầu dạng (u, v) nghĩa là phải làm u trước v.
//In ra thứ tự làm các công việc thoả mãn m yêu cầu. Nếu không có cách, in IMPOSSIBLE 
#include <bits/stdc++.h>
using namespace std;

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

    int n, m;
    cin >> n >> m;

    vector<vector<int>> adj(n + 1);
    vector<int> indegree(n + 1, 0);

    // Đọc các yêu cầu
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        indegree[v]++;
    }

    queue<int> q;

    // Đưa các công việc không có yêu cầu trước vào queue
    for (int i = 1; i <= n; i++) {
        if (indegree[i] == 0) {
            q.push(i);
        }
    }

    vector<int> topo_order;

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        topo_order.push_back(u);

        for (int v : adj[u]) {
            indegree[v]--;
            if (indegree[v] == 0) {
                q.push(v);
            }
        }
    }

    // Nếu chưa lấy đủ n đỉnh nghĩa là có chu trình, có 1 tập các công việc bị phụ thuộc vào nhau
    if ((int)topo_order.size() != n) {
        cout << "IMPOSSIBLE\n";
    } else {
        for (int x : topo_order) {
            cout << x << " ";
        }
        cout << "\n";
    }

    return 0;
}