#include <bits/stdc++.h>
using namespace std;
const long double PI = acos(-1);
const int INF = 2e9 + 5;
const long long LINF = 1e18 + 5;
const long long MOD = 1e9 + 7;
int ad[32];
int vis;
int used;
vector<int> level[24];
int tot;
inline void bfs(int u) {
  used |= 1 << u;
  queue<int> q;
  q.push(u);
  while (!q.empty() && used != tot) {
    int frente = q.front();
    q.pop();
    int tosee = (ad[frente] & used) ^ ad[frente];
    while (tosee != 0) {
      int v = __builtin_ctz(tosee);
      int h = 1 << v;
      if (!(used & h) && (vis & h)) {
        q.push(v);
      }
      tosee -= h;
    }
    used |= ad[frente];
  }
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  tot = (1 << n) - 1;
  for (int i = 0; i < n; ++i) ad[i] = 0;
  int x, y;
  for (int i = 0; i < m; ++i) {
    scanf("%d %d", &x, &y);
    --x, --y;
    ad[x] |= 1 << y;
    ad[y] |= 1 << x;
  }
  if (2 * m == n * (n - 1)) {
    printf("0\n");
    return 0;
  }
  int head;
  int right_mask = 0;
  for (int mask = 1; mask < (1 << n); ++mask)
    level[__builtin_popcount(mask)].push_back(mask);
  int lo = 0, hi = n;
  while (hi - lo > 1) {
    int sz = (lo + hi) >> 1;
    for (int mask : level[sz]) {
      used = 0;
      vis = mask;
      head = __builtin_ctz(mask);
      bfs(head);
      if (used == tot) {
        right_mask = mask;
        break;
      }
    }
    if (used == tot) {
      hi = sz;
    } else
      lo = sz;
  }
  if (__builtin_popcount(right_mask) != hi) {
    for (int mask : level[hi]) {
      used = 0;
      vis = mask;
      head = __builtin_ctz(mask);
      bfs(head);
      if (used == tot) {
        right_mask = mask;
        break;
      }
    }
  }
  printf("%d\n", hi);
  for (int i = 0; i < n; ++i) {
    if ((right_mask >> i) & 1) printf("%d ", i + 1);
  }
  printf("\n");
  return 0;
}
