func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 100100;   int N, M;   vector<int> conn[MAXN];   bool adj[10][10];   bool vis[MAXN];   int deg[10];   int ar[MAXN];   int pa[10];   int pb[10];   int numed;   void prec() {     for (int j = 0; j < numed; ++j) {       int a = 2, b = 1;       for (int k = 0; k < j; ++k) {         if (b + 1 >= a) {           ++a;           b = 1;         } else {           ++b;         }       }       pa[j] = a;       pb[j] = b;     }   }   void go6() {     numed = N * (N - 1) / 2;     prec();     for (int i = 1; i <= N; ++i) {       for (typeof((conn[i]).begin()) j = (conn[i]).begin(), _j = (conn[i]).end();            j != _j; ++j) {         adj[i][*j] = true;       }     }     bool fnd = false;     for (int i = 0; i < (1 << numed); ++i) {       int cnt = 0;       bool bad = false;       for (int j = 1; j <= N; ++j) {         deg[j] = 0;       }       for (int j = 0; j < numed; ++j) {         if ((i >> j) & 1) {           int a = pa[j];           int b = pb[j];           if (adj[a][b]) {             bad = true;             break;           }           ++deg[a];           ++deg[b];           if (deg[a] > 2 || deg[b] > 2) {             bad = true;             break;           }           ++cnt;         }       }       if (bad) continue;       if (cnt != M) continue;       fnd = true;       for (int j = 0; j < numed; ++j) {         if ((i >> j) & 1) {           int a = pa[j], b = pb[j];           printf( %d %d n , a, b);         }       }       break;     }     if (!fnd) {       printf( -1 n );     }   }   int cnt;   bool dfs(int x, int prv = -1) {     if (vis[x]) return true;     vis[x] = true;     ++cnt;     for (typeof((conn[x]).begin()) i = (conn[x]).begin(), _i = (conn[x]).end();          i != _i; ++i) {       if (*i != prv && dfs(*i, x)) {         return true;       }     }     return false;   }   int main() {     scanf( %d %d , &N, &M);     for (int i = 0; i < M; ++i) {       int a, b;       scanf( %d %d , &a, &b);       conn[a].push_back(b);       conn[b].push_back(a);     }     if (N <= 6) {       go6();     } else {       if (M > N) {         printf( -1 n );         return 0;       }       int pos = 0;       for (int i = 1; i <= N; ++i) {         if (!vis[i]) {           cnt = 0;           if (dfs(i)) {             int a = i;             int b = conn[a][0];             int cur = pos;             int end = pos + cnt;             bool up = true;             do {               ar[cur] = a;               int c = conn[b][0];               if (c == a) c = conn[b][1];               a = b;               b = c;               if (up) {                 if (cur + 2 < end)                   cur += 2;                 else {                   if (cur + 1 < end)                     cur += 1;                   else                     cur -= 1;                   up = false;                 }               } else {                 cur -= 2;               }             } while (a != i);           } else {             int a = i;             int b = -1;             while (int((conn[a]).size()) == 2) {               int p = a;               if (conn[a][0] == b)                 a = conn[a][1];               else                 a = conn[a][0];               b = p;             }             int cur = pos;             b = -1;             while (true) {               ar[cur] = a;               ++cur;               if (int((conn[a]).size()) == 0) break;               if (int((conn[a]).size()) == 1 && b != -1) break;               int p = a;               if (conn[a][0] == b)                 a = conn[a][1];               else                 a = conn[a][0];               b = p;             }           }           pos += cnt;         }       }       for (int i = 0; i < M; ++i) {         printf( %d %d n , ar[i], ar[(i + 3) % N]);       }     }     return 0;   }   