#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const double PI = acos(-1.0);
const auto INF = 0x3f3f3f3f;
int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return x < 0 ? -1 : 1;
}
const int MAXN = 23;
bool d[MAXN][MAXN];
int dp[1 << MAXN], inq[1 << MAXN];
pair<int, int> p[1 << MAXN];
vector<int> G[MAXN];
void print(int t) {
  if (dp[t] == 0) return;
  print(p[t].first);
  printf("%d ", p[t].second + 1);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  while (m--) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    G[u].push_back(v), G[v].push_back(u);
    d[u][v] = d[v][u] = 1;
  }
  memset(dp, INF, sizeof(dp));
  dp[0] = 0;
  queue<int> Q;
  for (int i = 0; i < n; i++) {
    int S = 1 << i;
    for (int v : G[i]) S |= (1 << v);
    dp[S] = 1;
    bool f = 1;
    for (int u : G[i]) {
      for (int v : G[i])
        if (u != v) {
          if (!d[u][v]) f = 0;
        }
    }
    dp[S] -= f;
    Q.push(S);
    inq[S] = 1;
    p[S] = {0, i};
  }
  while (!Q.empty()) {
    int S = Q.front();
    Q.pop();
    inq[S] = 0;
    for (int i = 0; i < n; i++)
      if (S & (1 << i)) {
        int S0 = S;
        for (int v : G[i]) S0 |= (1 << v);
        if (dp[S0] > dp[S] + 1) {
          dp[S0] = dp[S] + 1;
          p[S0] = {S, i};
          if (!inq[S0]) {
            inq[S0] = 1;
            Q.push(S0);
          }
        }
      }
  }
  int t = (1 << n) - 1;
  printf("%d\n", dp[t]);
  print(t);
  puts("");
  return 0;
}
