Problem: Arseny likes to organize parties and invite people to it. However, not only friends come to his parties, but friends of his friends, friends of friends of his friends and so on. That's why some of Arseny's guests can be unknown to him. He decided to fix this issue using the following procedure.

At each step he selects one of his guests A, who pairwise introduces all of his friends to each other. After this action any two friends of A become friends. This process is run until all pairs of guests are friends.

Arseny doesn't want to spend much time doing it, so he wants to finish this process using the minimum number of steps. Help Arseny to do it.

Input

The first line contains two integers n and m (1 ≤ n ≤ 22; <image>) — the number of guests at the party (including Arseny) and the number of pairs of people which are friends.

Each of the next m lines contains two integers u and v (1 ≤ u, v ≤ n; u ≠ v), which means that people with numbers u and v are friends initially. It's guaranteed that each pair of friends is described not more than once and the graph of friendship is connected.

Output

In the first line print the minimum number of steps required to make all pairs of guests friends.

In the second line print the ids of guests, who are selected at each step.

If there are multiple solutions, you can output any of them.

Examples

Input

5 6
1 2
1 3
2 3
2 5
3 4
4 5


Output

2
2 3 

Input

4 4
1 2
1 3
1 4
3 4


Output

1
1 

Note

In the first test case there is no guest who is friend of all other guests, so at least two steps are required to perform the task. After second guest pairwise introduces all his friends, only pairs of guests (4, 1) and (4, 2) are not friends. Guest 3 or 5 can introduce them.

In the second test case guest number 1 is a friend of all guests, so he can pairwise introduce all guests in one step.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
namespace fastinput {
template <class T = int>
inline T readInt();
inline long double readDouble();
inline int readUInt();
inline int readChar();
inline void readWord(char *s);
inline bool readLine(char *s);
inline bool isEof();
inline int peekChar();
inline bool seekEof();
template <class T>
inline void writeInt(T x, int len = -1);
template <class T>
inline void writeUInt(T x, int len = -1);
inline void writeChar(int x);
inline void writeWord(const char *s);
inline void writeDouble(long double x, int len = 0);
inline void flush();
static const int buf_size = 4096;
static char buf[buf_size];
static int buf_len = 0, buf_pos = 0;
inline bool isEof() {
  if (buf_pos == buf_len) {
    buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);
    if (buf_pos == buf_len) return 1;
  }
  return 0;
}
inline int getChar() { return isEof() ? -1 : buf[buf_pos++]; }
inline int peekChar() { return isEof() ? -1 : buf[buf_pos]; }
inline bool seekEof() {
  int c;
  while ((c = peekChar()) != -1 && c <= 32) buf_pos++;
  return c == -1;
}
inline int readChar() {
  int c = getChar();
  while (c != -1 && c <= 32) c = getChar();
  return c;
}
inline int readUInt() {
  int c = readChar(), x = 0;
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar();
  return x;
}
template <class T>
inline T readInt() {
  int s = 1, c = readChar();
  T x = 0;
  if (c == '-') s = -1, c = getChar();
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar();
  return s == 1 ? x : -x;
}
inline long double readDouble() {
  int s = 1, c = readChar();
  long double x = 0;
  if (c == '-') s = -1, c = getChar();
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar();
  if (c == '.') {
    c = getChar();
    long double coef = 1;
    while ('0' <= c && c <= '9') x += (c - '0') * (coef *= 0.1), c = getChar();
  }
  return s == 1 ? x : -x;
}
inline void readWord(char *s) {
  int c = readChar();
  while (c > 32) *s++ = (char)c, c = getChar();
  *s = 0;
}
inline bool readLine(char *s) {
  int c = getChar();
  while (c != '\n' && c != -1) *s++ = (char)c, c = getChar();
  *s = 0;
  return c != -1;
}
static int write_buf_pos = 0;
static char write_buf[buf_size];
inline void writeChar(int x) {
  if (write_buf_pos == buf_size)
    fwrite(write_buf, 1, buf_size, stdout), write_buf_pos = 0;
  write_buf[write_buf_pos++] = (char)x;
}
inline void flush() {
  if (write_buf_pos)
    fwrite(write_buf, 1, write_buf_pos, stdout), write_buf_pos = 0;
}
template <class T>
inline void writeInt(T x, int output_len) {
  if (x < 0) writeChar('-'), x = -x;
  char s[24];
  int n = 0;
  while (x || !n) s[n++] = '0' + x % 10, x /= 10;
  while (n < output_len) s[n++] = '0';
  while (n--) writeChar(s[n]);
}
template <class T>
inline void writeUInt(T x, int output_len) {
  char s[24];
  int n = 0;
  while (x || !n) s[n++] = (char)('0' + (char)(x % 10)), x /= 10;
  while (n < output_len) s[n++] = '0';
  while (n--) writeChar(s[n]);
}
inline void writeWord(const char *s) {
  while (*s) writeChar(*s++);
}
inline void writeDouble(long double x, int output_len) {
  if (x < 0) writeChar('-'), x = -x;
  int t = (int)x;
  writeUInt(t), x -= t;
  writeChar('.');
  for (int i = output_len - 1; i > 0; i--) {
    x *= 10;
    t = std::min(9, (int)x);
    writeChar('0' + t), x -= t;
  }
  x *= 10;
  t = std::min(9, (int)(x + 0.5));
  writeChar('0' + t);
}
}  // namespace fastinput
using namespace fastinput;
using namespace std;
const int MAX_MEM = 2e8;
int mpos = 0;
char mem[MAX_MEM];
inline void *operator new(size_t n) {
  mpos += n;
  return (void *)(mem + mpos - n);
}
inline void operator delete(void *) noexcept {}
const int N = 22;
bitset<N> g[N];
bitset<N> now[N];
vector<int> masks[N + 1];
int keep[N + 1];
int popcnt(int x) {
  if (x == 0) return 0;
  return 1 + popcnt(x & (x - 1));
}
int main() {
  ::ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    g[a][b] = 1;
    g[b][a] = 1;
  }
  for (int i = 0; i < n; ++i) g[i][i] = 1;
  for (int i = 0; i < (1 << n); ++i) {
    int sz = popcnt(i);
    masks[sz].push_back(i);
  }
  int l = -1, r = n - 1;
  while (l < r - 1) {
    int mid = (l + r) / 2;
    bool go = false;
    for (auto x : masks[mid]) {
      for (int i = 0; i < n; ++i) now[i] = g[i];
      for (int i = 0; i < n; ++i) {
        if ((1 << i) & x) {
          for (int j = 0; j < n; ++j) {
            if (now[i].test(j)) {
              now[j] |= now[i];
            }
          }
        }
      }
      bool bad = false;
      for (int i = 0; !bad && i < n; ++i) {
        if (now[i].count() < n) {
          bad = true;
        }
      }
      if (!bad) {
        keep[mid] = x;
        go = true;
        break;
      }
    }
    if (go)
      r = mid;
    else
      l = mid;
  }
  int x;
  if (n == r + 1)
    x = (1 << (n - 1)) - 1;
  else
    x = keep[r];
  cout << r << "\n";
  for (int i = 0; i < n; ++i) {
    if ((1 << i) & x) {
      cout << i + 1 << " ";
    }
  }
  return 0;
}