#include<stdio.h>#include <iostream>#include<cmath>#include<cstring>#include<algorithm>#include <string>#include<queue>#include<vector>template <class T>inline bool rd(T &ret) {char c; int sgn;if (c = getchar(), c == EOF) return 0;while (c != '-' && (c<'0' || c>'9')) c = getchar();sgn = (c == '-') ? -1 : 1;ret = (c == '-') ? 0 : (c - '0');while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');ret *= sgn;return 1;}template <class T>inline void pt(T x) {if (x <0) {putchar('-');x = -x;}if (x>9) pt(x / 10);putchar(x % 10 + '0');}const int N = 50;using namespace std;string name[N] = { "ewrt", "meth", "eth", "prop", "but", "pent", "hex", "hept", "oct", "non", "dec", "undec", "dodec", "tridec", "tetradec", "pentadec" };vector<int>G[N];struct hehe{int dis[N], pre[N], id, sum;vector<int>D[N];int dfs(int u, int fa){int siz = 1;for (int i = 0; i < G[u].size(); i++){int v = G[u][i];if (v != fa)siz += dfs(v, u);}return siz;}int bfs(int s, int t){memset(dis, -1, sizeof dis);memset(pre, -1, sizeof pre);dis[s] = 1;queue<int>q; q.push(s);while (!q.empty()){int u = q.front(); q.pop();for (int i = 0; i < G[u].size(); i++){int v = G[u][i];if (dis[v] != -1)continue;dis[v] = dis[u] + 1;pre[v] = u;q.push(v);}}int last = -1, val = 0;while (t != -1){for (int i = 0; i < G[t].size(); i++){int v = G[t][i];if (v != last && v != pre[t]){if (id == -1 || id > dis[t]) id = dis[t];sum += dis[t];D[dfs(v, t)].push_back(dis[t]);}}last = t;t = pre[t];}}int T;void work(int s, int t){T = t;id = -1;sum = 0;for (int i = 0; i < N; i++)D[i].clear();bfs(s, t);for (int i = 0; i < N; i++)sort(D[i].begin(), D[i].end());}int big(int x, int y){ if(D[x].size()!=D[y].size())return D[x].size()<D[y].size(); return x<y;}void put(){int f = 0;bool vis[N]; memset(vis,0,sizeof vis);for (int i , tim = 1; tim < N; tim++) { int pos = -1; for(int j = 1; j < N; j++) if(vis[j]==0 && D[j].size() && (pos == -1 || big(j,pos))) pos = j; if(pos == -1)break; vis[pos] = 1; i = pos; if (f++) putchar('-'); for (int j = 0; j < D[i].size(); j++) { if (j)printf(","); printf("%d", D[i][j]); } putchar('-'); if (2 == (int)D[i].size()) printf("di"); else if (3 == (int)D[i].size()) printf("tri"); else if (4 == (int)D[i].size()) printf("tetra"); else if ((int)D[i].size() > 4){ cout << name[D[i].size()]; printf("a"); } cout << name[i]; printf("yl"); }cout << name[dis[T]];puts("ane");}}b[2];int dis[N], pre[N];int bfs(int s, int t){memset(dis, -1, sizeof dis);memset(pre, -1, sizeof pre);dis[s] = 0;queue<int>q; q.push(s);while (!q.empty()){int u = q.front(); q.pop();for (int i = 0; i < G[u].size(); i++){int v = G[u][i];if (dis[v] != -1)continue;dis[v] = dis[u] + 1;pre[v] = u;q.push(v);}}int last = -1, val = 0;while (t != -1){for (int i = 0; i < G[t].size(); i++){int v = G[t][i];if (v != last && v != pre[t])val++;}last = t;t = pre[t];}return val;}int n, m, len, a[2], siz;void find_total(){len = siz = 0;for (int i = 1; i <= n; i++)for (int j = i + 1; j <= n; j++){int tmp = bfs(i, j);if (dis[j] > len || (dis[j] == len && tmp > siz)){len = dis[j]; a[0] = i; a[1] = j;siz = tmp;}}}void input(){for (int i = 0; i < N; i++)G[i].clear();int u, v;while (m--){scanf("%d %d", &u, &v);G[u].push_back(v);G[v].push_back(u);}}int main() {while (~scanf("%d %d", &n, &m)){input();find_total();b[0].work(a[0], a[1]);b[1].work(a[1], a[0]);if (b[0].id<b[1].id)b[0].put();else if (b[0].id>b[1].id)b[1].put();else{if (b[0].sum < b[1].sum)b[0].put();else if(b[0].sum > b[1].sum)b[1].put(); else { int id = -1; for(int i = N-1; id==-1 && i >= 0; i--) { if(b[0].D[i].size()>b[1].D[i].size()) id = 0; else if(b[0].D[i].size()<b[1].D[i].size()) id = 1; else { for(int j = 0; j < b[0].D[i].size(); j++) if(b[0].D[i][j]<b[1].D[i][j]) id = 0; else if(b[0].D[i][j]>b[1].D[i][j]) id = 1; } } if(id==-1)id=0; b[id].put(); }}}return 0;}