Link to this code: https://cses.fi/paste/3febffc363f54010ceed11/
#include <bits/stdc++.h>
using namespace std;

#define repeat(i,n) for(int i = 0 ; i < n ; i++)
#define repeat_range(i,a,n) for(int i = a ; i < n ; i++)
#define PB push_back
#define F first
#define S second
#define max_ll(a,b) ((a) > (b) ? (a) : (b))
#define min_ll(a,b) ((a) < (b) ? (a) : (b))

typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9 ; 
const int MOD = 1e9+7;

vector<vector<int>> adj_list ; 
vector<int> min_node_subtree ; 
vector<bool> visited ; 
int n , m ; 

void dfs1(int u, int p){
    visited[u] = true ; 
    min_node_subtree[u] = u ; 
    for(int v : adj_list[u])
        if(v != p){
            visited[v] = true ; 
            dfs1(v,u) ; 
            min_node_subtree[u] = min(min_node_subtree[v],min_node_subtree[u]) ; 
        }
}

vector<int> result ; 

void dfs2(int u, vector<bool> & visited2){
    visited2[u] = true ; 
    for(int v : adj_list[u])
        if(!visited2[v]){
            visited2[v] = true ; 
            dfs2(v,visited2) ; 
        }
    result.push_back(u) ; 
}

int main() {
    cin >> n >> m ; 
    adj_list.resize(n) ;
    min_node_subtree.assign(n,0) ;  
    repeat(i,m){
        int u , v ; 
        cin >> u >> v ; 
        u-- ; v-- ;
        adj_list[v].push_back(u) ; // To do v you must do u first  
    }

    /*
    Algo : Start a DFS from 1 then , for each branch maintain the smallest node in that tree
             choose the one with the smallest always
    Now push in the result vector in the order 
    */
    visited.assign(n,0) ; 
    min_node_subtree.assign(n,INF) ; 
    for(int i = 0 ; i<n ; i++)
        if(!visited[i])
            dfs1(i,i) ; 

    // Sort the adj_list based on the min_node_subtree 
    for(int i = 0 ; i<n ; i++)
        sort(
            adj_list[i].begin(),adj_list[i].end(),
            [&](int a, int b){return min_node_subtree[a] < min_node_subtree[b] ; }
        ) ;
    
    // Now run the dfs on sorted_Adj_list 
    vector<bool> visited2(n,0) ; 
    for(int s = 0 ; s<n ; s++){
        if(!visited2[s])
            dfs2(s,visited2) ; 
    }

    repeat(i,n)
        cout << result[i] + 1  << " \n"[i==n-1] ; 

    return 0;
}