//
//  main.cpp
//  Nikkei09Qual
//
//  Created by 原大曜 on 2019/01/27.
//  Copyright © 2019年 原大曜. All rights reserved.
//

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

void probA()
{
    int N,A,B;
    cin >> N >> A >> B;
    cout << std::min(A,B) << " " << std::max(0,(A + B - N)) << endl;
}

void probB()
{
    int N;
    string A,B,C;
    cin >> N >> A >> B >> C;
    int sum = 0;
    for(int i=0;i<N;i++)
    {
        if(A[i]==B[i] && B[i]==C[i])
        {
            
        }
        else if(A[i] == B[i] && B[i] != C[i])
        {
            sum += 1;
        }
        else if(A[i] != B[i] && B[i] == C[i])
        {
            sum+=1;
        }
        else if(A[i] != B[i] && A[i] == C[i])
        {
            sum+=1;
        }
        else
        {
            sum+=2;
        }
    }
    cout << sum << endl;
}

void probC()
{
    int N;
    vector<pair<int,int>> takahashi;
    cin >> N;
    for(int i=0;i<N;i++)
    {
        int t,a;
        cin>>t>>a;
        takahashi.emplace_back(t,a);
    }
    sort(takahashi.begin(), takahashi.end(), [](const pair<int, int>& l, const pair<int, int>& r){return l.first + l.second > r.first + r.second;});

    long sum = 0;
    bool isT = true;
    for(const auto& pair: takahashi)
    {
        sum += isT ? pair.first : -1 * pair.second;
        isT = !isT;
    }
    
    cout << sum << endl;
}

void probD()
{
    int N,M;
    cin >> N >> M;
    
    vector<vector<int>> parents(N);
    vector<vector<int>> childList(N);
    vector<int> depth(N);
    
    fill(parents.begin(),parents.end(),vector<int>());
    fill(childList.begin(),childList.end(),vector<int>());
    fill(depth.begin(),depth.end(),-1);
    
    for(int i=0;i<N+M-1;i++)
    {
        int a,b;
        cin>>a>>b;
        a--;b--;
        parents[b].push_back(a);
        childList[a].push_back(b);
    }
    
    //ルートを探す
    int root = -1;
    for(int i=0;i<N+M;i++)
    {
        if(parents[i].empty())
        {
            root = i;
            break;
        }
    }
    //親から深さ優先で見たとき、他の親を持つノードにぶつかったなら今たどったリンクはショートカットになっているので偽物
    std::function<void(int,int,int)> dfs = [&](int p, int from, int d)
    {
        //親の中に深さが決定してないものがあるなら偽物
        //そもそもすでに消されている
        if(from != -1 && find(parents[p].begin(),parents[p].end(),from) == parents[p].end())
        {
            return;
        }
        
        
        if(parents[p].size() > 1)
        {
            //いずれかの親の深さが確定していないなら、自分が偽物
            bool existsUnknown = false;
            for(int pp:parents[p])
            {
                if(depth[pp] == -1)
                {
                    existsUnknown = true;
                    break;
                }
            }
            if(existsUnknown)
            {
                auto it = find(parents[p].begin(), parents[p].end(), from);
                parents[p].erase(it);
                return;
            }
            else
            {
                //自分以外が偽物
                for(int i=parents[p].size()-1;i>=0;i--)
                {
                    if(parents[p][i] != from)
                    {
                        parents[p].erase(parents[p].begin()+i);
                    }
                }
            }
        }
        
        depth[p] = d;
        
        for(int i=0;i<childList[p].size();i++)
        {
            dfs(childList[p][i], p, d+1);
        }
    };
    
    dfs(root, -1, 0);
    
    for(int i=0;i<parents.size();i++)
    {
        cout << (parents[i].empty()?0:(parents[i][0] + 1)) << endl;
    }
}

int main(int argc, const char * argv[]) {
    probD();
}



Measured memory_bytes: 23040