#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;

set < int > viz[3030];
vector < int > ans;


void euler(int u){
	while(!viz[u].empty()){
		int v=*viz[u].begin();
		viz[u].erase(v);
		viz[v].erase(u);
		euler(v);
	}
	ans.push_back(u);
}

bool foi[3030];
int grau[3030];
int ct;
int n,m;

void dfs(int i, int w, int u){
	foi[u]=true;
	if(u==i){
		for(auto v: viz[u]){
			if((grau[v]&1 and v!=w) or foi[v]) continue;
			dfs(i,w,v);
		}
	}
	else{
		for(auto v: viz[u]){
			if(foi[v]) continue;
			dfs(i,w,v);
		}
	}
}

int connected(int i){
	for(auto v: viz[i]){
		if(grau[v]&1){
			dfs(i,v,i);
			bool tt=true;
			for(int i=1; i<=n; i++){
				if(!foi[i] and !(grau[i]&1))tt=false;
				foi[i]=false;
			}
			if(tt) return v;
		}
	}
	dfs(i,0,i);
	bool tt=true;
	for(int i=1; i<=n; i++){
		if(!foi[i] and !(grau[i]&1))tt=false;
		foi[i]=false;
	}
	if(tt) return 0;
	
	
	return -1;
}



int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	set < int > cj;
	cj.insert(5);
	cin >> n  >> m;
	for(int i=0; i<m; i++){
		int x,y;
		cin >> x >> y;
		viz[x].insert(y); viz[y].insert(x);
		grau[x]++;
		grau[y]++;
	}
	for(int i=1; i<=n; i++) if(grau[i]&1) ct++;
	for(int i=1; i<=n; i++){
		int nct=0;
		for(auto w: viz[i]){
			nct+=grau[w]&1;
		}
		int tt=ct-(grau[i]&1);
		tt-=nct;
		tt+=(grau[i]-nct)&1;
		if(tt==0 or (tt==2 and (grau[i]-nct)&1)){
			vector < int > ans1;
			vector < int > kp;
			int v=-1;
			if(tt==0) v=connected(i);
			for(auto w: viz[i]){
				if(!(grau[w]&1) or (w==v)) continue;
				ans1.push_back(w); ans1.push_back(i);
				kp.push_back(w);
				viz[w].erase(viz[w].find(i));
			}
			for(auto w: kp) viz[i].erase(w);
			if(v!=-1 or tt==2) euler(i);
			if((ans.size()-1+ans1.size()/2)!=m){
				
			}
			else{
				int t=ans1.size()+ans.size();
				if(!ans1.empty()) t++;
				cout << t << endl;
				for(auto w: ans) cout << w << ' ';
				if(!ans1.empty()) cout << "-1 ";
				for(auto w: ans1) cout << w << ' ';
				cout << endl;
				return 0;
			}
		}
	}
	cout << 0 << endl;
}
