#pragma once
#include<vector>
#include"graph_template.hpp"
std :: vector < int > euler_tour ( graph v , int s ){
std :: vector < int > ret ;
auto f = []( auto f , int n , int p ) -> void {
ret . push_back ( n );
for ( auto e : v ){
if ( e == p ) continue ;
f ( f , e , n );
}
ret . push_back ( n );
};
f ( f , s , - 1 );
return ret ;
}
#line 2 "graph_tree/euler_tour.hpp"
#include<vector>
#line 3 "graph_tree/graph_template.hpp"
#include<tuple>
#include<iostream>
/**
* @brief グラフテンプレート
*/
using graph = std :: vector < std :: vector < int >> ;
template < typename T >
using graph_w = std :: vector < std :: vector < std :: pair < int , T >>> ;
graph load_graph ( int n , int m ){ graph g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; std :: cin >> s >> t ; -- s ; -- t ; g [ s ]. push_back ( t ); g [ t ]. push_back ( s );} return g ;}
graph load_digraph ( int n , int m ){ graph g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; std :: cin >> s >> t ; -- s ; -- t ; g [ s ]. push_back ( t );} return g ;}
graph load_graph0 ( int n , int m ){ graph g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; std :: cin >> s >> t ; g [ s ]. push_back ( t ); g [ t ]. push_back ( s );} return g ;}
graph load_digraph0 ( int n , int m ){ graph g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; std :: cin >> s >> t ; g [ s ]. push_back ( t );} return g ;}
graph load_tree ( int n ){ graph g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int s , t ; std :: cin >> s >> t ; -- s ; -- t ; g [ s ]. push_back ( t ); g [ t ]. push_back ( s );} return g ;}
graph load_tree0 ( int n ){ graph g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int s , t ; std :: cin >> s >> t ; g [ s ]. push_back ( t ); g [ t ]. push_back ( s );} return g ;}
graph load_treep ( int n ){ graph g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int t ; std :: cin >> t ; g [ i + 1 ]. push_back ( t ); g [ t ]. push_back ( i + 1 );} return g ;}
template < typename T > graph_w < T > load_graph_weight ( int n , int m ){ graph_w < T > g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; -- s ; -- t ; g [ s ]. emplace_back ( t , u ); g [ t ]. emplace_back ( s , u );} return g ;}
template < typename T > graph_w < T > load_digraph_weight ( int n , int m ){ graph_w < T > g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; -- s ; -- t ; g [ s ]. emplace_back ( t , u );} return g ;}
template < typename T > graph_w < T > load_graph0_weight ( int n , int m ){ graph_w < T > g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; g [ s ]. emplace_back ( t , u ); g [ t ]. emplace_back ( s , u );} return g ;}
template < typename T > graph_w < T > load_digraph0_weight ( int n , int m ){ graph_w < T > g ( n ); for ( int i = 0 ; i < m ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; g [ s ]. emplace_back ( t , u );} return g ;}
template < typename T > graph_w < T > load_tree_weight ( int n ){ graph_w < T > g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; -- s ; -- t ; g [ s ]. emplace_back ( t , u ); g [ t ]. emplace_back ( s , u );} return g ;}
template < typename T > graph_w < T > load_tree0_weight ( int n ){ graph_w < T > g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int s , t ; T u ; std :: cin >> s >> t >> u ; g [ s ]. emplace_back ( t , u ); g [ t ]. emplace_back ( s , u );} return g ;}
template < typename T > graph_w < T > load_treep_weight ( int n ){ graph_w < T > g ( n ); for ( int i = 0 ; i < n - 1 ; ++ i ){ int t ; T u ; std :: cin >> t >> u ; g [ i + 1 ]. emplace_back ( t , u ); g [ t ]. emplace_back ( i + 1 , u );} return g ;}
#line 4 "graph_tree/euler_tour.hpp"
std :: vector < int > euler_tour ( graph v , int s ){
std :: vector < int > ret ;
auto f = []( auto f , int n , int p ) -> void {
ret . push_back ( n );
for ( auto e : v ){
if ( e == p ) continue ;
f ( f , e , n );
}
ret . push_back ( n );
};
f ( f , s , - 1 );
return ret ;
}