#include<bits/stdc++.h>
using namespace std;
int read() {
	char c=getchar(); int x=0,f=1;
	while (c<'0' || c>'9') {
		if (c=='-') f=-1;
		c=getchar();
	}
	while (c>='0' && c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
struct edge {
	int v,next;
}e[6005];
int n,m,ecnt=0,head[3005];
void addedge(int u,int v) {
	e[ecnt].v=v;
	e[ecnt].next=head[u];
	head[u]=ecnt++;
}
vector<int> ans;
int deg[3005],cut[6005],vis[6005];
void dfs(int c) {
	vis[c]=1;
	for (int i=head[c]; i>=0; i=e[i].next) {
		int v=e[i].v;
		if (cut[i] || vis[v]) continue;
		dfs(v);
	}
}
bool connect(int c) {
	for (int i=1; i<=n; i++) vis[i]=(deg[i]==0);
	dfs(c);
	for (int i=1; i<=n; i++) if (vis[i]==0) return false;
	return true;
}
void euler(int c) {
	for (int i=head[c]; i>=0; i=e[i].next) {
		int v=e[i].v;
		if (cut[i] || vis[i]) continue;
		vis[i]=1; vis[i^1]=1;
		euler(v);
	}
	ans.push_back(c);
}
void print(int c) {
	for (int i=0; i<ecnt; i++) vis[i]=0;
	euler(c);
}
void print2(int c) {
	print(c);
	ans.push_back(-1);
	for (int i=head[c]; i>=0; i=e[i].next) {
		int v=e[i].v;
		if (cut[i]) {
			ans.push_back(v);
			ans.push_back(c);
		}
	}
}
int main() {
	n=read(),m=read(),ecnt=0;
	for (int i=1; i<=n; i++) head[i]=-1;
	for (int i=1; i<=m; i++) {
		int u=read(),v=read();
		addedge(u,v);
		addedge(v,u);
		++deg[u]; ++deg[v];
	}
	int odd=0;
	for (int i=1; i<=n; i++) odd+=(deg[i]&1);
	if (odd==0) print(1);
	else if (odd==2) {
		for (int i=1; i<=n; i++) if (deg[i]&1) {
			print(i);
			break;
		}
	}
	else {
		bool flag=true;
		for (int c=1; c<=n && flag; c++) {
			odd-=(deg[c]&1);
			for (int i=head[c]; i>=0; i=e[i].next) {
				int v=e[i].v;
				if (deg[v]&1) {
					--deg[v]; --deg[c];
					--odd;
					cut[i]=1; cut[i^1]=1;
				}
			}
			if (odd==0) {
				if (flag && connect(c)) {
					print2(c);
					flag=false;
				}
				else {
					for (int i=head[c]; i>=0; i=e[i].next) {
						int v=e[i].v;
						if (cut[i]) {
							++deg[v]; ++deg[c];
							cut[i]=0; cut[i^1]=0;
							if (flag && connect(c)) {
								print2(c);
								flag=false;
							}
							--deg[v]; --deg[c];
							cut[i]=1; cut[i^1]=1;
						}
					}
				}
			}
			else if (odd==1) {
				if (flag && connect(c)) {
					print2(c);
					flag=false;
				}
			}
			for (int i=head[c]; i>=0; i=e[i].next) {
				int v=e[i].v;
				if (cut[i]) {
					++deg[v]; ++deg[c];
					++odd;
					cut[i]=0; cut[i^1]=0;
				}
			}
			odd+=(deg[c]&1);
		}
	}
	printf("%d\n", ans.size());
	for (int i=0; i<ans.size(); i++) 
		printf("%d%c", ans[i], (i+1==ans.size())?'\n':' ');
	return 0;
}
