#include <bits/stdc++.h>
using namespace std;
const long long linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);
template <typename T>
istream& operator>>(istream& is, vector<T>& vec) {
  for (auto&& x : vec) is >> x;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
  for (long long i = (0), __last_i = (vec.size()); i < __last_i; i++) {
    if (i) os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<vector<T> >& vec) {
  for (long long i = (0), __last_i = (vec.size()); i < __last_i; i++) {
    if (i) os << endl;
    os << vec[i];
  }
  return os;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  vector<long long> g(n, 0);
  for (long long i = (0), __last_i = (m); i < __last_i; i++) {
    long long a, b;
    cin >> a >> b;
    --a, --b;
    g[a] |= 1LL << b;
    g[b] |= 1LL << a;
  }
  for (long long i = (0), __last_i = (n); i < __last_i; i++) g[i] |= 1LL << i;
  if (m == n * (n - 1) / 2) {
    cout << 0 << endl;
    return 0;
  }
  vector<pair<long long, long long> > prv(1LL << n);
  vector<long long> dist(1LL << n, linf);
  queue<long long> Q;
  for (long long i = (0), __last_i = (n); i < __last_i; i++) {
    dist[1LL << i] = 0;
    prv[1LL << i] = {-1, -1};
    Q.push(1LL << i);
  }
  while (!Q.empty()) {
    long long i = Q.front();
    Q.pop();
    for (long long j = (0), __last_j = (n); j < __last_j; j++) {
      if ((i >> j & 1) == 0) continue;
      long long ni = i | g[j];
      if (dist[i] + 1 < dist[ni]) {
        dist[ni] = dist[i] + 1;
        prv[ni] = {i, j};
        Q.push(ni);
      }
    }
  }
  vector<long long> ans;
  long long v = (1LL << n) - 1;
  assert(dist[v] < linf);
  while (prv[v].second >= 0) {
    ans.push_back(prv[v].second);
    v = prv[v].first;
  }
  reverse((ans).begin(), (ans).end());
  cout << ans.size() << endl;
  for (auto&& a : ans) ++a;
  cout << ans << endl;
}
