1 3, 2 3 ⇒ 이거는 1번이 3번보다 앞에, 2번이 3번보다 앞에 있어야 한다는 거다.

즉, 답은 1 2 3 또는 2 1 3.

Input (1 3, 2 3) 에서 뒤에 오는 번호(3 두 번)의 차수를 올려준다.

가장 앞에 있는 애들 (Input에서 두 번째 숫자로 안 들어온 애들). 최소 한 명은 있다.

얘들부터 큐에 다 넣어서, 하나씩 빼면서 얘들보다 뒤에 오는 애들 차수를 하나씩 낮춰주고, 만약 차수가 0이 되면 더이상 얘보다 꼭 앞에 와야 하는 애가 없는 거니깐 큐에 넣어준다.

큐에서 뺀 순서대로 적으면 그게 줄 세워진 결과다.

// 물론 이 문제는 사이클이 없는 경우를 주지만,

// 만약 사이클이 존재한다면,

// (예를 들어 1 3, 3 2, 2 1 , 이건 1이 3보다 크고 3이 2보다 큰데 2가 1보다 큰 말이 안 되는 상황.)

// 큐에서 전체 개수인 N번 만큼 빼기 전에 큐가 비어버린다.

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

const int MAX_N = 32000;

int N, M;
int Degree[MAX_N + 1];
int Result[MAX_N + 1];
vector<vector<int>> Graph;

void Input() 
{
    cin >> N >> M;
    Graph.resize(N + 1);

    for (int i = 0; i < M; ++i) 
    {
        int A, B;
        cin >> A >> B;
        Graph[A].push_back(B);
        Degree[B]++;
    }
}

void Sort() 
{
    queue<int> Q;
    for (int i = 1; i <= N; i++) 
    {
        if (Degree[i] == 0) Q.push(i);
    }

    for (int i = 0; i < N; i++) 
    {
        // When a cycle exists
        if (Q.empty()) return;

        int Now = Q.front();
        Result[i] = Now;
        Q.pop();

        for (int j = 0; j < Graph[Now].size(); j++) 
        {
            int Next = Graph[Now][j];
            if (--Degree[Next] == 0) Q.push(Next);
        }
    }
}

int main() {

    ios::sync_with_stdio(false), cin.tie(0);

    Input();
    Sort();

    for (int i = 0; i < N; ++i) 
    {
        cout << Result[i] << " ";
    }

    return 0;
}