#include <bits/stdc++.h>
using namespace std;


const int maxn = 6005;

int h[maxn],ee=0,vs[maxn],n,m,deg[maxn],near[maxn];
struct EDGE{
	int u,v;
}edge[maxn];
struct Edge{
	int v,next;
}e[maxn];
void init(int n){
	memset(h,-1,sizeof(int)*(n+2));
	memset(deg,0,sizeof(int)*(n+2));
	ee=0;
}
void addedge(EDGE &edge){
	int u=edge.u,v=edge.v;
	deg[u]++;
	deg[v]++;
	e[ee]=Edge{v,h[u]};
	h[u]=ee++;
	e[ee]=Edge{u,h[v]};
	h[v]=ee++;
}
vector<int>ans1;
vector<int>ans2;
void dfs(int u){
	while(~h[u]){
		int i=h[u];
		int v=e[i].v;
		h[u]=e[h[u]].next;
		if(vs[i])continue;
		vs[i]=vs[i^1]=1;
		deg[u]--,deg[v]--;
		dfs(v);
		ans1.push_back(v);
	}
}
bool work(int u){
	memset(near,0,sizeof(int)*(n+2));
	memset(vs,0,sizeof(int)*(2*m+4));
	for(int i=h[u];~i;i=e[i].next){
		int v=e[i].v;
		near[v]=1;
	}
	int ct=0,s=0;
	for(int i=1;i<=n;++i){
		if(!near[i] && i!=u){
			if(deg[i]&1){
				ct++;
				s=i;
			}
		}
	}
	if(ct>=2)return false;
	if(ct==1){
		for(int i=h[u];~i;i=e[i].next){
			int v=e[i].v;
			if(deg[v]&1){
				vs[i]=vs[i^1]=1;
				deg[v]--,deg[u]--;
				ans2.push_back(v);
				ans2.push_back(u);
			}
		}
		dfs(s);
		ans1.push_back(s);
		reverse(ans1.begin(),ans1.end());
		for(int i=1;i<=n;++i)if(deg[i])return false;
		return true;
	}else{
		s=0;
		vector<EDGE>g;
		for(int i=h[u];~i;i=e[i].next){
			int v=e[i].v;
			if(deg[v]&1)g.push_back(EDGE{i,e[i].v}),vs[i]=vs[i^1]=1,deg[u]--,deg[v]--;
		}
		for(auto d:g){
			s=d.v;int i=d.u;
			vs[i]=vs[i^1]=0;
			deg[u]++,deg[s]++;
			ans1.clear();
			dfs(s);
			ans1.push_back(s);
			bool ok=true;
			for(int i=1;i<=n;++i)if(deg[i]){
				ok=false;
				break;
			}
			if(ok){
				reverse(ans1.begin(),ans1.end());
				for(auto dd:g){
					if(dd.v!=s){
						ans2.push_back(dd.v);
						ans2.push_back(u); 
					}
				}
				return true;
			}
			memset(vs,0,sizeof(int)*(2*m+4)); 
			init(n);
			for(int i=1;i<=m;++i)addedge(edge[i]);
			for(auto dd:g)vs[dd.u]=vs[dd.u^1]=1,deg[u]--,deg[dd.v]--;
		}
		for(int i=h[u];~i;i=e[i].next){
			int v=e[i].v;
			if(deg[v]&1){
				ans2.push_back(v);
				ans2.push_back(u);
			}
		}
		if(!(deg[u]&1))dfs(u);else return false;
		ans1.push_back(u);
		for(int i=1;i<=n;++i)if(deg[i])return false;
		return true;
	}
	return false;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)scanf("%d%d",&edge[i].u,&edge[i].v);
	for(int i=1;i<=n;++i){
		init(n);
		for(int j=1;j<=m;++j)addedge(edge[j]);
		if(work(i)){
			if(ans2.empty())printf("%d\n",(int)ans1.size());
			else printf("%d\n",(int)ans1.size()+1+(int)ans2.size());
			for(auto u:ans1){
				printf("%d ",u);
			}
			if(!ans2.empty())printf("-1 ");
			for(auto u:ans2)printf("%d ",u);puts("");
			return 0;
		}
	}
	printf("0\n");
}
