Problem:
Score : 500 points

Problem Statement

You are given a connected undirected simple graph, which has N vertices and M edges.
The vertices are numbered 1 through N, and the edges are numbered 1 through M.
Edge i connects vertices A_i and B_i.
Your task is to find a path that satisfies the following conditions:

The path traverses two or more vertices.

The path does not traverse the same vertex more than once.

A vertex directly connected to at least one of the endpoints of the path, is always contained in the path.

It can be proved that such a path always exists.
Also, if there are more than one solution, any of them will be accepted.

Constraints

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq A_i < B_i \leq N

The given graph is connected and simple (that is, for every pair of vertices, there is at most one edge that directly connects them).

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
A_2 B_2
:
A_M B_M

Output

Find one path that satisfies the conditions, and print it in the following format.
In the first line, print the count of the vertices contained in the path.
In the second line, print a space-separated list of the indices of the vertices, in order of appearance in the path.

Sample Input 1

5 6
1 3
1 4
2 3
1 5
3 5
2 4

Sample Output 1

4
2 3 1 4

There are two vertices directly connected to vertex 2: vertices 3 and 4.
There are also two vertices directly connected to vertex 4: vertices 1 and 2.
Hence, the path 2 → 3 → 1 → 4 satisfies the conditions.

Sample Input 2

7 8
1 2
2 3
3 4
4 5
5 6
6 7
3 5
2 6

Sample Output 2

7
1 2 3 4 5 6 7

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using static MyIO;


public class B
{
	public static void Main()
	{
		(new Solver()).Solve();
	}
}


public class Solver
{
	private int N;
	private int M;
	private int[] A;
	private int[] B;
	private List<int>[] adj;

	public Solver()
	{
		N = GetInt();
		M = GetInt();
		A = new int[M];
		B = new int[M];
		adj = Enumerable.Range(0, N).Select(_ => new List<int>()).ToArray();
		for(int i = 0; i < M; i++)
		{
			A[i] = GetInt() - 1;
			B[i] = GetInt() - 1;
			adj[A[i]].Add(B[i]);
			adj[B[i]].Add(A[i]);
		}
	}

	public void Solve()
	{
		bool[] visited = new bool[N];
		var deq = new Deque<int>(N + 2);
		deq.PushBack(A[0]);
		deq.PushBack(B[0]);
		visited[A[0]] = true;
		visited[B[0]] = true;

		while(true)
		{
			bool update = false;

			int front = deq.PeekFront();
			foreach(int v in adj[front])
			{
				if(visited[v])
					continue;

				deq.PushFront(v);
				visited[v] = true;
				update = true;
				break;
			}

			int back = deq.PeekBack();
			foreach(int v in adj[back])
			{
				if(visited[v])
					continue;

				deq.PushBack(v);
				visited[v] = true;
				update = true;
				break;
			}

			if(!update)
				break;
		}

		var ans = new List<int>(deq.Count);
		while(deq.Count > 0)
			ans.Add(deq.PopFront() + 1);
		Console.WriteLine(ans.Count);
		Console.WriteLine(string.Join(" ", ans.Select(x => x.ToString()).ToArray()));
	}
}


public class Deque<T>
{
	private int size;
	private T[] buf;
	private int front;
	private int back;

	public int Count => (front > back) ? front - back : back - front;

	public Deque(int N)
	{
		size = N;
		buf = new T[N];
		front = 0;
		back = 0;
	}

	public void PushBack(T data)
	{
		if(Count == size)
			throw new Exception();

		buf[back] = data;
		back = (back == size - 1) ? 0 : back + 1;
	}

	public T PeekBack() => buf[(back == 0) ? size - 1 : back - 1];

	public T PopBack()
	{
		if(Count == 0)
			throw new Exception();

		back = (back == 0) ? size - 1 : back - 1;
		return buf[back];
	}
	
	public void PushFront(T data)
	{
		if(Count == size)
			throw new Exception();

		front = (front == 0) ? size - 1 : front - 1;
		buf[front] = data;
	}

	public T PeekFront() => buf[front];

	public T PopFront()
	{
		if(Count == 0)
			throw new Exception();

		T res = buf[front];
		front = (front == size - 1) ? 0 : front + 1;
		return res;
	}
}


public static class MyIO
{
	private static string[] args = null;
	private static int num = -1;
	private static int used = -1;

	private static string getArg()
	{
		if(used == num)
		{
			args = Console.ReadLine().Split(' ');
			num = args.Length;
			used = 0;
		}
		return args[used++];
	}

	public static int GetInt(){ return int.Parse(getArg()); }
	public static long GetLong(){ return long.Parse(getArg()); }
	public static double GetDouble(){ return double.Parse(getArg()); }
	public static string GetString(){ return getArg(); }
}