#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;

int main() {
    stack<pair<bool,int> > dfs;
    stack<int> postOrder;
    vector<int> newVec;
    vector<int>::iterator it;
    vector<vector<int> > graph {
    	{1, 2}
    ,   {2, 3}
    ,   {3, 4, 7}
    ,   {4}
    ,   {5}
    ,   {6, 7}
    ,   {}
    ,   {6}
    };
    vector<bool> visited(graph.size());
	for(int i=0;i<graph.size();i++){
        if(visited[i]==false){
            dfs.push(make_pair(false,i));
        }   
        while(!dfs.empty()){
            pair<bool,int> node=dfs.top();
            dfs.pop();
            if (node.first) {
            	postOrder.push(node.second);
            	cout << node.second << endl;
            	continue;
            }
            visited[node.second]=true;
            dfs.push(make_pair(true, node.second));
            newVec=graph[node.second]; //vector of neighboors
            for(it=newVec.begin();it!=newVec.end();it++){
                int son=*it;
                if(visited[son]==false){
                    dfs.push(make_pair(false, son));
                }
            }
        }
    }
	return 0;
}