#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
const int maxn = 205;
const int INF = 1e9+10;
const double eps = 1e-8;
struct Edge{
int to, rev;
double cap;
Edge(int _to, double _cap, int _rev):to(_to), cap(_cap), rev(_rev){}
};
vector<Edge> G[maxn];
int cnt[maxn];
int level[maxn];
int s, t;
int n, m;
int d[maxn];
void add_edge(int u, int v, double cap){
G[u].push_back(Edge(v, cap, G[v].size()));
G[v].push_back(Edge(u, 0, G[u].size()-1));
}
void bfs(int s){
memset(level, -1, sizeof(level));
queue<int> q;
q.push(s);
level[s] = 0;
while(!q.empty()){
int v = q.front();
q.pop();
for(int i=0; i<G[v].size(); i++){
Edge& e = G[v][i];
if(e.cap>eps&&level[e.to]<0){
level[e.to] = level[v]+1;
q.push(e.to);
}
}
}
}
double dfs(int v, int t, double flow){
if(v == t) return flow;
for(int& i=cnt[v]; i<G[v].size(); i++){
Edge& e = G[v][i];
if(e.cap>0&&level[v]<level[e.to]){
double d = dfs(e.to, t, min(flow, e.cap));
if(d>eps){
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
double max_flow(int s, int t){
double flow = 0;
for(;;){
bfs(s);
if(level[t]<0) return flow;
double f;
memset(cnt, 0, sizeof(cnt));
while((f = dfs(s, t, INF))>eps){
flow+=f;
}
}
}
int x[1024], y[1024];
void graph(double g){
for(int i=0; i<=n+1; i++){
G[i].clear();
}
for(int i=0; i<m; i++){
add_edge(x[i], y[i], 1.0), add_edge(y[i], x[i], 1.0);
}
for (int i = 1; i <= n; i++)
{
add_edge(s, i, m);
add_edge(i, t, m + 2 * g - d[i]);
}
}
int sum = 0;
bool vis[maxn];
void dfs_ans(int u){
sum++;
vis[u] = true;
for(int i=0; i<G[u].size(); i++){
Edge v = G[u][i];
if(v.cap>eps&&!vis[v.to]){
dfs_ans(v.to);
}
}
}
int main()
{
while(~scanf("%d%d", &n, &m)){
if(m == 0){
printf("1\n1\n");
continue;
}
for(int i=0; i<maxn; i++) d[i] = 0;
int u, v;
for(int i=0; i<m; i++){
scanf("%d%d", &x[i], &y[i]);
d[x[i]]++, d[y[i]]++;
}
s = 0;
t = n+1;
double l=0, r=m;
double mid;
const double presion = 1.0/n/n;
while(r-l>=presion){
mid = ((l+r)/2.0);
graph(mid);
if((n*m-max_flow(s, t))/2.0>eps) l=mid;
else r=mid;
}
graph(l);
max_flow(s, t);
sum = 0, memset(vis, 0, sizeof(vis));
dfs_ans(0);
printf("%d\n", sum-1);
for(int i=1; i<=n; i++) {
if(vis[i]) printf("%d\n", i);
}
}
return 0;
}