#include <bits/stdc++.h>
const int N = 22;
const int M = (1 << 22);
const int INF = 0x3f3f3f3f;
bool dp[M] = {0};
int neib[N] = {0}, ex[M] = {0};
int main() {
  int m, n, u, v;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    neib[i] = (1 << i);
    dp[1 << i] = true;
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    --u;
    --v;
    dp[(1 << u) | (1 << v)] = true;
    neib[u] |= (1 << v);
    neib[v] |= (1 << u);
  }
  if (n == 1 || m == n * (n - 1) / 2) {
    printf("0\n");
    return 0;
  }
  for (int i = 0; i < (1 << n); ++i)
    if (dp[i]) {
      for (int j = 0; j < n; ++j)
        if (i & (1 << j)) {
          ex[i] |= neib[j];
        }
      for (int j = 0; j < n; ++j)
        if (ex[i] & (1 << j)) {
          dp[i | (1 << j)] = true;
        }
    }
  int best = INF;
  std::vector<int> ans;
  for (int i = 0; i < (1 << n); ++i)
    if (dp[i] && ex[i] == (1 << n) - 1) {
      int cnt = 0;
      for (int j = 0; j < n; ++j)
        if (i & (1 << j)) ++cnt;
      if (cnt >= best) continue;
      best = cnt;
      ans.clear();
      for (int j = 0; j < n; ++j)
        if (i & (1 << j)) ans.push_back(j);
    }
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); ++i) printf("%d ", ans[i] + 1);
  putchar('\n');
  return 0;
}
