func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX_N = 48 + 10;   vector<int> adj[MAX_N];   vector<int> ziro;   bool mark[MAX_N];   int ans[MAX_N][3];   int poi = 0;   vector<int> dfs(int v) {     vector<int> ret;     ret.push_back(v);     mark[v] = 1;     for (auto i : adj[v])       if (!mark[i]) {         vector<int> vec = dfs(i);         while (vec.size()) {           ret.push_back(vec.back());           vec.pop_back();         }       }     return ret;   }   int main() {     int n, m;     cin >> n >> m;     for (int i = 0; i < m; i++) {       int a, b;       cin >> a >> b;       a--, b--;       adj[a].push_back(b);       adj[b].push_back(a);     }     for (int i = 0; i < n; i++)       if (adj[i].empty()) ziro.push_back(i);     for (int i = 0; i < n; i++)       if (!mark[i]) {         vector<int> vec = dfs(i);         if (vec.size() > 3) {           cout << -1;           return 0;         } else if (vec.size() == 3) {           for (int j = 0; j < 3; j++) ans[poi][j] = vec[j];           poi++;         } else if (vec.size() == 2) {           if (ziro.empty()) {             cout << -1;             return 0;           }           for (int j = 0; j < 2; j++) ans[poi][j] = vec[j];           ans[poi][2] = ziro.back();           ziro.pop_back();           poi++;         }       }     if (ziro.size() % 3 != 0) {       cout << -1;       return 0;     }     while (ziro.size()) {       for (int i = 0; i < 3; i++) {         ans[poi][i] = ziro.back();         ziro.pop_back();       }       poi++;     }     for (int i = 0; i < poi; i++) {       for (int j = 0; j < 3; j++) cout << ans[i][j] + 1 <<    ;       cout <<   n ;     }   }   