#include <bits/stdc++.h>
using namespace std;

class Graph{
	public:
	int n, m;
	vector<vector<int>> adj;

	Graph(int nodes): adj(nodes){
		n = nodes;
		m = 0;
	}

	void addEdge(int u, int v){
		adj[u].push_back(v);
		++m;
	}

	void dfs(int u, vector<bool> &visited, stack<int> &st, bool &useStack){
		visited[u] = true;
		cout<<u<<" ";
		
		for(auto adjNode: adj[u]){
			if(!visited[adjNode]){
				dfs(adjNode, visited, st, useStack);
				
				if(useStack){
					st.push(adjNode);
				}
			}
		}
	}

	void findRoute(){
		vector<bool> visited(n, false);
		stack<int> st;
		
		bool useStack = true;
		
		cout<<"DFS: ";
		for(int i=0; i<n; ++i){
			if(!visited[i]){
				dfs(i, visited, st, useStack);
				st.push(i);
			}
		}
		
		cout<<"\nThe topological sort: ";
		while(!st.empty()){
			int u = st.top();
			
			cout<<u;
			
			st.pop();
			
			if(!st.empty())
				cout<<" ";
		}

	}

	void printGraph(){
		cout<<"The adjacency list,\n"; 
		for(int i=0; i<n; ++i){
			cout<<"Node "<<i<<": ";
			for(auto node:adj[i])
				cout<<"->"<<node;
			cout<<"\n";
		}
	}
};

int main()
{
	int n; 
	
	cin>>n;

	Graph g(n);

	cin>>n;
	
	int inp, inp2;

	for(int i=0; i<n; ++i){
		cin>>inp>>inp2;
		g.addEdge(inp, inp2);
	}

	g.printGraph();
	
	cout<<"----------------------------------\n";
	
	g.findRoute();

	return 0;
}

