//我忘不掉夏小姐了。
//如果不是知道了咩粟小姐，说不定我已经对这个世界没有留恋了。
//巫沐小姐真的好可爱啊。做料理的时候笨拙的样子很可爱，故意撒娇，修女小姐也很可爱，唱歌的时候很可爱，生气拍桌子的时候也很可爱。
//所以我离不开星夜小姐了。如果早晨不是有多多小姐的起床闹钟的话，说不定我永远都不愿意睁眼了。如果晚上不是有黎歌小姐的直播预定的话，这一天我都不希望过完了。
//萨摩小姐的眼睛好灵动，如果能映照出我就好了。冷鸢小姐的笑容好温柔，如果只为我一个人绽放就好了。鹿乃小姐的头发好柔顺，如果能让我尽情抚摸就好了。
//白桃小姐这样的存在真的是被允许的吗。
//只是像现在这样默念七海小姐的名字，我就觉得自己是世界上最最最最最幸福的傻子。
#include<bits/stdc++.h>
using namespace std;

int n,m;
set<int> g1[3005],g2[3005];

struct UnionFind{
    int sz;
    vector<int> fa;

    UnionFind(int _sz=100000){
        fa.resize((sz=_sz)+1);
        iota(fa.begin(),fa.end(),0);
    }

    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }

    void unite(int x,int y){
        x=find(x);
        y=find(y);
        fa[x]=y;
    }
}uf;

void dfs(int x,vector<int> &v){
    while(!g1[x].empty()){
        int y=*g1[x].begin();
        g1[x].erase(y);
        g1[y].erase(x);
        dfs(y,v);
    }
    v.emplace_back(x);
}

void printeven(int c){
    vector<int> v;
    dfs(c,v);
    v.emplace_back(-1);
    for(int i:g2[c]){
        v.emplace_back(i);
        v.emplace_back(c);
    }
    cout<<v.size()<<'\n';
    for(int x:v)cout<<x<<' ';
    exit(0);
}

void printodd(int c){
    int x=-1,y=-1;
    for(int i=1;i<=n;i++)if(g1[i].size()&1){
        if(x==-1)x=i;
        else y=i;
    }
    if(x!=c&&y!=c)return;
    printeven(c);
}

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        g1[u].emplace(v);
        g1[v].emplace(u);
    }
    for(int c=1;c<=n;c++){
        vector<int> adj;
        for(int i:g1[c])adj.emplace_back(i);
        for(int i:adj)if(g1[i].size()&1){
            g1[c].erase(i);
            g1[i].erase(c);
            g2[c].emplace(i);
            g2[i].emplace(c);
        }
        for(int i:adj){
            if(g1[c].find(i)==g1[c].end()){
                g1[c].emplace(i);
                g1[i].emplace(c);
                g2[c].erase(i);
                g2[i].erase(c);
            }else{
                g1[c].erase(i);
                g1[i].erase(c);
                g2[c].emplace(i);
                g2[i].emplace(c);
            }
            uf=UnionFind(n);
            for(int x=1;x<=n;x++)for(int y:g1[x])uf.unite(x,y);
            int root=-1;
            for(int x=1;x<=n;x++)if(!g1[x].empty()){
                if(root==-1)root=uf.find(x);
                else if(root!=uf.find(x))root=0;
            }
            if(root){
                int odd=0;
                for(int i=1;i<=n;i++)odd+=g1[i].size()&1;
                if(odd==0)printeven(c);
                else if(odd<=2)printodd(c);
            }
            if(g1[c].find(i)==g1[c].end()){
                g1[c].emplace(i);
                g1[i].emplace(c);
                g2[c].erase(i);
                g2[i].erase(c);
            }else{
                g1[c].erase(i);
                g1[i].erase(c);
                g2[c].emplace(i);
                g2[i].emplace(c);
            }
        }
        uf=UnionFind(n);
        for(int x=1;x<=n;x++)for(int y:g1[x])uf.unite(x,y);
        int root=-1;
        for(int x=1;x<=n;x++)if(!g1[x].empty()){
            if(root==-1)root=uf.find(x);
            else if(root!=uf.find(x))root=0;
        }
        if(root){
            int odd=0;
            for(int i=1;i<=n;i++)odd+=g1[i].size()&1;
            if(odd==0)printeven(c);
            else if(odd<=2)printodd(c);
        }
        for(int i:adj)if(g1[c].find(i)==g1[c].end()){
            g1[c].emplace(i);
            g1[i].emplace(c);
            g2[c].erase(i);
            g2[i].erase(c);
        }
    }
    cout<<'0';

    return 0;
}