#include <bits/stdc++.h>
using namespace std;
vector<int> graph[30], vec;
int allmask, n, m;
int dp[(1 << 22)];
int Set(int N, int pos) { return N = N | (1 << pos); }
int reset(int N, int pos) { return N = N & ~(1 << pos); }
bool check(int N, int pos) { return (bool)(N & (1 << pos)); }
int call(int mask) {
  if (mask == allmask) return 0;
  if (dp[mask] != -1) return dp[mask];
  int i, j, k, ret = 100000, newmask;
  for (i = 0; i < n; i++) {
    if (check(mask, i) or mask == 0) {
      newmask = Set(mask, i);
      for (j = 0; j < graph[i + 1].size(); j++)
        newmask = Set(newmask, graph[i + 1][j] - 1);
      if (mask != newmask) ret = min(ret, 1 + call(newmask));
    }
  }
  return dp[mask] = ret;
}
void path(int mask) {
  if (mask == allmask) return;
  int i, j, k, ret = 100000000, newmask;
  for (i = 0; i < n; i++) {
    if (check(mask, i) or mask == 0) {
      newmask = Set(mask, i);
      for (j = 0; j < graph[i + 1].size(); j++)
        newmask = Set(newmask, graph[i + 1][j] - 1);
      if (mask != newmask) {
        if (call(mask) == 1 + call(newmask)) {
          vec.push_back(i + 1);
          path(newmask);
          break;
        }
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  memset(dp, -1, sizeof(dp));
  int i, j, k, u, v;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> u >> v;
    graph[u].push_back(v);
    graph[v].push_back(u);
  }
  if (m == 0 or m >= (n * (n - 1) / 2)) {
    cout << "0" << endl;
    return 0;
  }
  allmask = (1 << n) - 1;
  int ans = call(0);
  path(0);
  cout << vec.size() << endl;
  for (i = 0; i < vec.size(); i++) cout << vec[i] << " ";
}
