#include <bits/stdc++.h>
using namespace std;
const int N = 2000006;
const int MOD = 1e9 + 7;
vector<int> G[N];
int n, m, pr[N];
int dp[(1 << 23) + 10], limit;
int find(int x) {
  if (x == pr[x]) return x;
  return pr[x] = find(pr[x]);
}
int ans_me(int mask) {
  if (mask == limit) return 0;
  if (dp[mask] != -1) return dp[mask];
  int ret = 0x3f3f3f3f;
  for (int i = 0; i < n; i++) {
    if (mask == (1 << n) || (mask & (1 << i))) {
      int nmask = mask | (1 << i);
      for (int y : G[i]) {
        nmask |= (1 << y);
      }
      if (mask != nmask) ret = min(ret, 1 + ans_me(nmask));
    }
  }
  return dp[mask] = ret;
}
void path(int mask) {
  if (mask == limit) return;
  for (int i = 0; i < n; i++) {
    if (mask == (1 << n) || (mask & (1 << i))) {
      int nmask = mask | (1 << i);
      for (int y : G[i]) {
        nmask |= (1 << y);
      }
      if (mask != nmask) {
        if (1 + ans_me(nmask) == ans_me(mask)) {
          cout << i + 1 << ' ';
          path(nmask);
          return;
        }
      }
    }
  }
  cout << "if the code comes here then there is a problem\n";
  assert(true);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i <= n; i++) pr[i] = i;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    G[x].push_back(y);
    G[y].push_back(x);
    x = find(x);
    y = find(y);
    if (x != y) pr[x] = y;
  }
  if (m * 2 == n * (n - 1)) {
    cout << "0\n";
    return 0;
  }
  limit = (1 << (n + 1)) - 1;
  memset(dp, -1, sizeof dp);
  int ans = ans_me(1 << n);
  cout << ans << '\n';
  path(1 << n);
  return 0;
}
