#include <bits/stdc++.h>
using namespace std;
int n, m, x, y;
int Ne[23], dp[(1 << (23))];
bool tut[(1 << (23))], vis[(1 << (23))], con[(1 << (23))];
bool solve(int mask) {
  if (vis[mask]) return tut[mask];
  if (!con[mask]) return tut[mask] = false;
  if (mask == (1 << (n)) - 1) return tut[mask] = true;
  for (int i = 0; i < n; i++) {
    int andVal = (1 << (i)) & mask;
    int orVal = Ne[i] | mask;
    if ((!andVal && mask) || dp[mask] + 1 != dp[orVal]) continue;
    tut[mask] |= solve(orVal);
  }
  vis[mask] = true;
  return tut[mask];
}
int main() {
  scanf("%d %d", &n, &m);
  if (m == 0 || m == n * (n - 1) / 2) {
    printf("0");
    return 0;
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &x, &y);
    x--;
    y--;
    Ne[x] |= (1 << (y));
    Ne[y] |= (1 << (x));
  }
  for (int i = 0; i < n; i++) Ne[i] |= (1 << (i));
  fill(con, con + (1 << (23)), 0);
  fill(dp, dp + (1 << (23)), 1000000009);
  dp[0] = 0;
  con[0] = true;
  for (int i = 0; i < (1 << (n)); i++) {
    if (!con[i]) continue;
    for (int j = 0; j < n; j++) {
      int andVal = (1 << (j)) & i;
      int orVal = Ne[j] | i;
      if (!andVal && i) continue;
      con[orVal] = true;
      dp[orVal] = min(dp[orVal], dp[i] + 1);
    }
  }
  printf("%d\n", dp[(1 << (n)) - 1]);
  solve(0);
  for (int i = 0; i < (1 << (n)) - 1;) {
    for (int j = 0; j < n; j++) {
      int andVal = (1 << (j)) & i;
      int orVal = Ne[j] | i;
      if ((!andVal && i) || !tut[orVal] || dp[i] + 1 != dp[orVal]) continue;
      printf("%d ", j + 1);
      i = orVal;
      break;
    }
  }
}
