#include <bits/stdc++.h>   const int N = 22;   const int M = (1 << 22);   const int INF = 0x3f3f3f3f;   bool dp[M] = {0};   int neib[N] = {0}, ex[M] = {0};   int main() {     int m, n, u, v;     scanf( %d%d , &n, &m);     for (int i = 0; i < n; ++i) {       neib[i] = (1 << i);       dp[1 << i] = true;     }     for (int i = 0; i < m; ++i) {       scanf( %d%d , &u, &v);       --u;       --v;       dp[(1 << u) | (1 << v)] = true;       neib[u] |= (1 << v);       neib[v] |= (1 << u);     }     if (n == 1 || m == n * (n - 1) / 2) {       printf( 0 n );       return 0;     }     for (int i = 0; i < (1 << n); ++i)       if (dp[i]) {         for (int j = 0; j < n; ++j)           if (i & (1 << j)) {             ex[i] |= neib[j];           }         for (int j = 0; j < n; ++j)           if (ex[i] & (1 << j)) {             dp[i | (1 << j)] = true;           }       }     int best = INF;     std::vector<int> ans;     for (int i = 0; i < (1 << n); ++i)       if (dp[i] && ex[i] == (1 << n) - 1) {         int cnt = 0;         for (int j = 0; j < n; ++j)           if (i & (1 << j)) ++cnt;         if (cnt >= best) continue;         best = cnt;         ans.clear();         for (int j = 0; j < n; ++j)           if (i & (1 << j)) ans.push_back(j);       }     printf( %d n , ans.size());     for (int i = 0; i < ans.size(); ++i) printf( %d  , ans[i] + 1);     putchar(  n );     return 0;   }   