    #include<bits/stdc++.h>
    #define pb push_back
    #define sz size()
    #define fo(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    const int N=3010;
    int n,m,x,y,s,tot;
    vector<int>e[N],E[N],a,b;
    bool lim[N][N],vs[N][N];
    void euler(int x)
    {
    	while(!E[x].empty())
    	{
    		int y=E[x].back(); E[x].pop_back();
    		if(!lim[x][y]&&!lim[y][x]&&!vs[x][y]) vs[x][y]=vs[y][x]=1,euler(y);
    	}
    	a.pb(x);
    }
    void doit(int x)
    {
    	fo(i,1,n)
    	{
    		E[i]=e[i];
    		for(int y:e[i]) vs[i][y]=0;
    	}
    	b.pb(-1);
    	for(int y:e[x]) if(lim[x][y]) b.pb(y),b.pb(x);
    	euler(x);
    	if(a.sz-1+b.sz/2<m) {a.clear(); b.clear(); return;}
    	printf("%d\n",a.sz+b.sz);
    	for(int y:a) printf("%d ",y);
    	for(int y:b) printf("%d ",y);
    	exit(0);
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	fo(i,1,m)
    	{
    		scanf("%d%d",&x,&y);
    		e[x].pb(y);
    		e[y].pb(x);
    	}
    	fo(i,1,n) s+=e[i].sz&1;
    	fo(x,1,n)
    	{
    		int sx=e[x].sz&1; s-=sx;
    		for(int y:e[x]) if(e[y].sz&1) lim[x][y]=1,s--,sx^=1;
    		s+=sx;
    		if(s>2||s==2&&!sx) goto NE;
    		doit(x);
    		if(s==2) goto NE;
    		for(int y:e[x]) if(lim[x][y])
    		{
    			lim[x][y]=0;
    			doit(x);
    			lim[x][y]=1;
    		}
    		NE:s+=(e[x].sz&1)-sx;
    		for(int y:e[x]) if(e[y].sz&1) lim[x][y]=0,s++;
    	}
    	puts("0");
    }

