Problem:
Score : 500 points

Problem Statement

There is a rooted tree (see Notes) with N vertices numbered 1 to N.
Each of the vertices, except the root, has a directed edge coming from its parent.
Note that the root may not be Vertex 1.

Takahashi has added M new directed edges to this graph.
Each of these M edges, u \rightarrow v, extends from some vertex u to its descendant v.

You are given the directed graph with N vertices and N-1+M edges after Takahashi added edges.
More specifically, you are given N-1+M pairs of integers, (A_1, B_1), ..., (A_{N-1+M}, B_{N-1+M}), which represent that the i-th edge extends from Vertex A_i to Vertex B_i.

Restore the original rooted tree.

Notes

For "tree" and other related terms in graph theory, see the article in Wikipedia, for example.

Constraints

3 \leq N

1 \leq M

N + M \leq 10^5

1 \leq A_i, B_i \leq N

A_i \neq B_i

If i \neq j, (A_i, B_i) \neq (A_j, B_j).

The graph in input can be obtained by adding M edges satisfying the condition in the problem statement to a rooted tree with N vertices.

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
:
A_{N-1+M} B_{N-1+M}

Output

Print N lines.
In the i-th line, print 0 if Vertex i is the root of the original tree, and otherwise print the integer representing the parent of Vertex i in the original tree.

Note that it can be shown that the original tree is uniquely determined.

Sample Input 1

3 1
1 2
1 3
2 3

Sample Output 1

0
1
2

The graph in this input is shown below:

It can be seen that this graph is obtained by adding the edge 1 \rightarrow 3 to the rooted tree 1 \rightarrow 2 \rightarrow 3.

Sample Input 2

6 3
2 1
2 3
4 1
4 2
6 1
2 6
4 6
6 5

Sample Output 2

6
4
2
0
6
2

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
//using System.Text;
//using System.Text.RegularExpressions;
//using System.Globalization;
//using System.Diagnostics;
using static System.Console;
//using System.Numerics;
//using static System.Math;
//using pair = Pair<int, int>;

class Program
{
    static void Main()
    {
        SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
        new Program().solve();
        Out.Flush();
    }
    readonly Scanner cin = new Scanner();
    readonly int[] dd = { 0, 1, 0, -1, 0 }; //→↓←↑
    readonly int mod = 1000000007;
    void chmax<T>(ref T a, T b) where T : IComparable<T> { a = a.CompareTo(b) < 0 ? b : a; }
    void chmin<T>(ref T a, T b) where T : IComparable<T> { a = a.CompareTo(b) < 0 ? a : b; }

    int N, M;
    List<int>[] G;
    List<int>[] H;
    int[] P;
    int[] F;
    bool[] B;

    // ref: http://abc070.contest.atcoder.jp/submissions/1505233

    void solve()
    {
        int N = cin.nextint;
        int M = cin.nextint;

        //input(N, N + M - 1);

        //int root = -1;
        //for (int i = 0; i < N; i++)
        //{
        //    if (!B[i])
        //    {
        //        root = i;
        //        break;
        //    }
        //}
        //dijkstra(root);
        //cin.join(D);

        //for (int i = 0; i < N; i++)
        //{
        //    if (D[i] == 0)
        //    {
        //        WriteLine(0);
        //        continue;
        //    }



        //}


        G = Enumerable.Range(0, N).Select(i => new List<int>()).ToArray();
        H = Enumerable.Range(0, N).Select(i => new List<int>()).ToArray();
        P = new int[N];
        F = new int[N];
        for (int i = 0; i < N; i++)
        {
            P[i] = -100;
            F[i] = -100;
        }

        for (int i = 0; i < N + M - 1; i++)
        {
            int a = cin.nextint - 1;
            int b = cin.nextint - 1;
            G[a].Add(b);
            H[b].Add(a);
        }

        for (int i = 0; i < N; i++)
        {
            if (H[i].Count == 0)
            {
                var A = new Queue<int>();
                A.Enqueue(i);
                var B = new Queue<int>();
                B.Enqueue(-1);
                F[i] = 0;
                int LOCK = 0;

                while (A.Any())
                {
                    var u = A.Dequeue();
                    var p = B.Dequeue();

                    if (LOCK < F[u])
                    {
                        LOCK = F[u];
                    }

                    if (P[u] != -100)
                    {
                        P[u] = p;
                        continue;
                    }

                    P[u] = p;

                    foreach (var v in G[u])
                    {
                        if (F[v] != -100 && F[v] < LOCK)
                        {
                            continue;
                        }
                        F[v] = F[u] + 1;

                        A.Enqueue(v);
                        B.Enqueue(u);
                    }
                }

                break;
            }
        }

        for (int i = 0; i < N; i++)
        {
            WriteLine(P[i] + 1);
        }
    }

}

class Scanner
{
    string[] s; int i;
    readonly char[] cs = new char[] { ' ' };
    public Scanner() { s = new string[0]; i = 0; }
    public string[] scan { get { return ReadLine().Split(); } }
    public int[] scanint { get { return Array.ConvertAll(scan, int.Parse); } }
    public long[] scanlong { get { return Array.ConvertAll(scan, long.Parse); } }
    public double[] scandouble { get { return Array.ConvertAll(scan, double.Parse); } }
    public string next
    {
        get
        {
            if (i < s.Length) return s[i++];
            string st = ReadLine();
            while (st == "") st = ReadLine();
            s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
            i = 0;
            return next;
        }
    }
    public int nextint { get { return int.Parse(next); } }
    public long nextlong { get { return long.Parse(next); } }
    public double nextdouble { get { return double.Parse(next); } }
    public void join<T>(IEnumerable<T> values) { WriteLine(string.Join(" ", values)); }
}