#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream& operator<<(ostream& stream, const vector<T> v) {
  stream << "[ ";
  for (int i = 0; i < (int)v.size(); i++) stream << v[i] << " ";
  stream << "]";
  return stream;
}
long long fpow(long long x, long long p, long long m) {
  long long r = 1;
  for (; p; p >>= 1) {
    if (p & 1) r = r * x % m;
    x = x * x % m;
  }
  return r;
}
int gcd(int a, int b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
int N, M, cnt, res, rmask, vec[30];
vector<int> rm[30];
void dfs(int p, int mask, int cr, int cnt) {
  if (cr >= res) return;
  if (p == N || cnt == N) {
    int i;
    for (i = 0; i < N; i++)
      if (vec[i] != (1 << N) - 1) return;
    if (cr < res) {
      res = cr, rmask = mask;
    }
    return;
  }
  dfs(p + 1, mask, cr, cnt);
  rm[p].clear();
  int i;
  for (i = 0; i < N; i++) rm[p].push_back(vec[i]);
  for (i = 0; i < N; i++)
    if (vec[p] & (1 << i)) {
      int old = vec[i];
      vec[i] |= vec[p];
      if (old != (1 << N) - 1 && vec[i] == (1 << N) - 1) cnt++;
    }
  dfs(p + 1, mask | (1 << p), cr + 1, cnt);
  for (i = 0; i < N; i++) vec[i] = rm[p][i];
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M;
  int i, x, y;
  for (i = 1; i <= M; i++) {
    cin >> x >> y;
    x--, y--;
    vec[x] |= (1 << y);
    vec[y] |= (1 << x);
  }
  for (i = 0; i < N; i++) vec[i] |= (1 << i);
  int cnt = 0;
  for (i = 0; i < N; i++)
    if (vec[i] == (1 << N) - 1) cnt++;
  res = N, rmask = (1 << N) - 1;
  dfs(0, 0, 0, cnt);
  cout << res << "\n";
  for (i = 0; i < N; i++)
    if (rmask & (1 << i)) cout << i + 1 << " ";
  return 0;
}
