Cod sursa(job #708023)
#include<cstdio>
#include<vector>
#define NMAX 100002
#define MMAX 500002
#define INfile "ciclueuler.in"
#define OUTfile "ciclueuler.out"
using namespace std;
vector < int > V [ NMAX ] , CE ;
int g [ NMAX ] , viz [ NMAX ] , S [ MMAX ] ;
int N , M , ok1 , TS ;
void check () ;
void read () ;
void solve () ;
void euler ( int ) ;
void write () ;
void erase ( int S , int D ) ;
int main ()
{
freopen ( INfile , "r" , stdin ) ;
freopen ( OUTfile , "w" , stdout ) ;
read () ;
check () ;
if ( ok1 )
printf ( "-1\n" ) ;
else
solve () ;
return 0 ;
}
void read ()
{
int i , x , y ;
scanf ( "%d%d" , & N , & M ) ;
for ( i = 1 ; i <= M ; ++ i )
{
scanf ( "%d%d" , & x , & y ) ;
++ g [ x ] ;
++ g [ y ] ;
V [ x ].push_back ( y ) ;
V [ y ].push_back ( x ) ;
}
}
void check ()
{
int i , s , d ;
for ( i = 1 ; i <= N ; ++ i )
if ( g [ i ] % 2 )
{
ok1 = 1 ;
return ;
}
int in , sf ;
int Q [ NMAX ] ;
in = sf = 1 ;
Q [ in ] = 1 ;
viz [ 1 ] = 1 ;
while ( in <= sf )
{
s = Q [ in ] ;
++ in ;
for ( i = 0 ; i < g [ s ] ; ++ i )
{
d = V [ s ][ i ] ;
if ( viz [ d ] == 0 )
{
++ sf ;
Q [ sf ] = d ;
viz [ d ] = 1 ;
}
}
}
if ( sf != N )
ok1 = 1 ;
}
void solve()
{
int v ;
v = 1 ;
do {
euler ( v ) ;
v = S [ TS ] ; -- TS ;
CE . push_back ( v ) ;
} while ( TS ) ;
write () ;
}
void euler ( int v )
{
int w ;
while ( 1 )
{
if ( ! g [ v ] )
return ;
S [ ++ TS ] = v ;
w = V [ v ][ 0 ] ;
erase ( v , w ) ;
v = w ;
}
}
void erase ( int S , int D )
{
swap ( V [ S ][ 0 ] , V [ S ][ -- g [ S ] ] ) ;
int i ;
for ( i = 0 ; i < g [ D ] ; ++ i )
if ( V [ D ][ i ] == S )
{
swap ( V [ D ][ i ] , V [ D ][ -- g [ D ] ] ) ;
return ;
}
}
void write ()
{
int i ;
for ( i = 0 ; i < ( int ) CE.size () ; ++ i )
printf ( "%d " , CE [ i ] ) ;
}