#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>
#define IN "ciclueuler.in"
#define OUT "ciclueuler.out"
#define t top
#define p pop
#define pu push
#define pb push_back
const int MAX = 100014 ;
using namespace std;
ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;
vector < int > gr [ MAX ] ;
stack < int > s ;
void euler ( int nod ) ;
int ciclu [ MAX ] , u , n , m ;
int main()
{
fin >> n >> m ;
for ( register int i = 1 ; i <= m ; ++ i ) {
int x , y ;
fin >> x >> y ;
gr [ x ].pb ( y ) ;
gr [ y ].pb ( x ) ;
}
for ( register int i = 1 ; i <= n ; ++ i )
if ( gr [ i ].size ( ) & 1 ){
fout << "-1" ;
return 0 ;
}
euler ( 1 ) ;
for ( register int i = 1 ; i < u ; ++ i )
fout << ciclu [ i ] << " " ;
return 0;
}
void euler ( int nod ){
s.pu ( 1 ) ;
while ( !s.empty ( ) ){
int x = s.top ( ) ;
if ( gr [ x ].size ( ) ) {
int y = gr [ x ].back ( ) ;
s.pu ( y ) ;
gr [ x ].pop_back ( ) ;
gr [ y ].erase ( find ( gr [ y ].begin ( ) , gr [ y ].end ( ) , x ) ) ;
}
else{
ciclu [ ++ u ] = x ;
s.p ( ) ;
}
}
}