#include <bits/stdc++.h>
using namespace std;
int vis;
vector<vector<int> > graph;
void dfs(int u, int &use) {
  vis |= (1 << u);
  for (auto &e : graph[u])
    if (!((1 << e) & vis) && ((1 << e) & use)) dfs(e, use);
}
int main() {
  ios::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<int> gp(n, 0);
  graph.assign(n, vector<int>());
  for (int i = 0; i < n; i++) gp[i] |= (1 << i);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    gp[a] |= (1 << b), gp[b] |= (1 << a);
    graph[a].push_back(b), graph[b].push_back(a);
  }
  bool is_ok = true;
  for (int i = 0; i < n; i++)
    if (gp[i] != (1 << n) - 1) is_ok = false;
  if (is_ok) {
    cout << 0 << endl;
    return 0;
  }
  int ans = 1000000000, st = 0;
  vector<int> connected(1 << n);
  for (int i = 0; i < n; i++) connected[1 << i] = 1;
  for (int i = 0; i < 1 << n; i++) {
    int cliq = 0, mn = 0, x = -1;
    for (int j = 0; j < n; j++)
      if ((1 << j) & i) cliq |= gp[j], mn++, x = j;
    if (cliq == (1 << n) - 1 && mn < ans) {
      vis = 0;
      dfs(x, i);
      if (vis == i)
        if (mn < ans) ans = mn, st = i;
    }
  }
  cout << ans << endl;
  for (int j = 0; j < n; j++)
    if ((1 << j) & st) cout << j + 1 << " ";
  return 0;
}
