#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;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmFwaHsKCXB1YmxpYzoKCWludCBuLCBtOwoJdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGo7CgoJR3JhcGgoaW50IG5vZGVzKTogYWRqKG5vZGVzKXsKCQluID0gbm9kZXM7CgkJbSA9IDA7Cgl9CgoJdm9pZCBhZGRFZGdlKGludCB1LCBpbnQgdil7CgkJYWRqW3VdLnB1c2hfYmFjayh2KTsKCQkrK207Cgl9CgoJdm9pZCBkZnMoaW50IHUsIHZlY3Rvcjxib29sPiAmdmlzaXRlZCwgc3RhY2s8aW50PiAmc3QsIGJvb2wgJnVzZVN0YWNrKXsKCQl2aXNpdGVkW3VdID0gdHJ1ZTsKCQljb3V0PDx1PDwiICI7CgkJCgkJZm9yKGF1dG8gYWRqTm9kZTogYWRqW3VdKXsKCQkJaWYoIXZpc2l0ZWRbYWRqTm9kZV0pewoJCQkJZGZzKGFkak5vZGUsIHZpc2l0ZWQsIHN0LCB1c2VTdGFjayk7CgkJCQkKCQkJCWlmKHVzZVN0YWNrKXsKCQkJCQlzdC5wdXNoKGFkak5vZGUpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXZvaWQgZmluZFJvdXRlKCl7CgkJdmVjdG9yPGJvb2w+IHZpc2l0ZWQobiwgZmFsc2UpOwoJCXN0YWNrPGludD4gc3Q7CgkJCgkJYm9vbCB1c2VTdGFjayA9IHRydWU7CgkJCgkJY291dDw8IkRGUzogIjsKCQlmb3IoaW50IGk9MDsgaTxuOyArK2kpewoJCQlpZighdmlzaXRlZFtpXSl7CgkJCQlkZnMoaSwgdmlzaXRlZCwgc3QsIHVzZVN0YWNrKTsKCQkJCXN0LnB1c2goaSk7CgkJCX0KCQl9CgkJCgkJY291dDw8IlxuVGhlIHRvcG9sb2dpY2FsIHNvcnQ6ICI7CgkJd2hpbGUoIXN0LmVtcHR5KCkpewoJCQlpbnQgdSA9IHN0LnRvcCgpOwoJCQkKCQkJY291dDw8dTsKCQkJCgkJCXN0LnBvcCgpOwoJCQkKCQkJaWYoIXN0LmVtcHR5KCkpCgkJCQljb3V0PDwiICI7CgkJfQoKCX0KCgl2b2lkIHByaW50R3JhcGgoKXsKCQljb3V0PDwiVGhlIGFkamFjZW5jeSBsaXN0LFxuIjsgCgkJZm9yKGludCBpPTA7IGk8bjsgKytpKXsKCQkJY291dDw8Ik5vZGUgIjw8aTw8IjogIjsKCQkJZm9yKGF1dG8gbm9kZTphZGpbaV0pCgkJCQljb3V0PDwiLT4iPDxub2RlOwoJCQljb3V0PDwiXG4iOwoJCX0KCX0KfTsKCmludCBtYWluKCkKewoJaW50IG47IAoJCgljaW4+Pm47CgoJR3JhcGggZyhuKTsKCgljaW4+Pm47CgkKCWludCBpbnAsIGlucDI7CgoJZm9yKGludCBpPTA7IGk8bjsgKytpKXsKCQljaW4+PmlucD4+aW5wMjsKCQlnLmFkZEVkZ2UoaW5wLCBpbnAyKTsKCX0KCglnLnByaW50R3JhcGgoKTsKCQoJY291dDw8Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CgkKCWcuZmluZFJvdXRlKCk7CgoJcmV0dXJuIDA7Cn0KCg==