#include <bits/stdc++.h>
using namespace std;
const int N = 23;
vector<int> adj[N];
bool subset[N], visited[N], taken[N];
int n, m, sz;
void dfs(int node) {
  visited[node] = 1;
  for (auto tail : adj[node]) {
    if (subset[tail] and !visited[tail]) dfs(tail);
    if (subset[node]) visited[tail] = 1;
  }
}
bool solve(int node, bool* inside, int cnt) {
  if (cnt == sz) {
    for (int i = 1; i <= n; i++) {
      memset(visited, 0, sizeof(visited));
      dfs(i);
      for (auto neighbor : adj[i]) visited[neighbor] = 1;
      for (int j = 1; j <= n; j++)
        if (!visited[j]) return false;
    }
    for (int i = 1; i <= n; i++) taken[i] = inside[i];
    return true;
  }
  if (node > n) return false;
  inside[node] = 0;
  bool ans = solve(node + 1, inside, cnt);
  if (ans) return ans;
  inside[node] = 1;
  ans = ans or solve(node + 1, inside, cnt + 1);
  inside[node] = 0;
  return ans;
}
int main() {
  cin >> n >> m;
  int u, v;
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  int low = -1, high = n + 1;
  while ((high - low) > 1) {
    sz = (high + low) / 2;
    if (solve(1, subset, 0))
      high = sz;
    else
      low = sz;
  }
  cout << high << endl;
  for (int i = 1; i <= n; i++)
    if (taken[i]) cout << i << " ";
  return 0;
}
