#include <bits/stdc++.h>
using namespace ::std;
const long long maxn = 22;
const long long mod = 1e9 + 7;
const long long inf = 50;
char dp[1 << maxn];
char kiupp[1 << maxn];
long long kiup[1 << maxn];
bool good[1 << maxn];
bool ger[maxn][maxn];
long long ham[maxn];
int main() {
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < m; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    ger[a][b] = 1;
    ger[b][a] = 1;
    ham[a] ^= (1 << b);
    ham[b] ^= (1 << a);
  }
  for (long long i = 0; i < n; i++) {
    ger[i][i] = 1;
  }
  good[0] = 1;
  for (long long mas = 1; mas < (1 << n); mas++) {
    long long v = mas;
    if ((v & (-v)) == v) {
      good[v] = 1;
    } else {
      long long u = __builtin_ctz(v);
      v -= (v & (-v));
      good[mas] = good[v];
      for (long long i = 0; i < n; i++) {
        if ((v >> i) & 1) {
          good[mas] &= ger[i][u];
        }
      }
    }
  }
  fill(dp, dp + (1 << maxn), inf);
  dp[0] = 0;
  for (long long mas = 1; mas < (1 << n); mas++) {
    if (good[mas]) {
      dp[mas] = 0;
    }
    for (long long i = 0; i < n; i++) {
      if ((mas >> i) & 1) {
        long long v = (mas | ham[i]);
        if (dp[v] > dp[mas] + 1) {
          dp[v] = dp[mas] + 1;
          kiup[v] = mas;
          kiupp[v] = i;
        }
      }
    }
  }
  long long v = (1 << n) - 1;
  cout << (int)dp[v] << endl;
  vector<long long> vec;
  while (dp[v] > 0) {
    vec.push_back(kiupp[v] + 1);
    v = kiup[v];
  }
  while (vec.size()) {
    cout << vec.back() << ' ';
    vec.pop_back();
  }
}
