//UVA140Bandwidth
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<sstream>
#include<vector>
#include<cmath>
using namespace std;
const int MAXN = 30;
const int INF = 1e9;
int G[MAXN][MAXN];
int min_wid = INF;
int n = 0;
int a[MAXN];
bool vis[MAXN];
vector<int> ans;
int id[300] = {0};
void dfs(int cur, int tmp_max, int* a, int cnt) {//cur:当前位置光标;tmp_max:当前暂时的最大带宽
if(cur == n) {
if(tmp_max >= min_wid) return;//本组合无法找到更小的带宽(回溯)
else {
min_wid = tmp_max;
ans.clear();
for(int i = 0; i < n; i++) ans.push_back(a[i]);//储存当前最优解
}
}
else {
for(int i = 0; i < n; i++) {
if(vis[i]) continue;
a[cur] = i;//从当前未使用的元素里选一个
vis[i] = true;
for(int j = 0; j < cur; j++) {
if(G[i][a[j]]) {tmp_max = max(tmp_max, abs(cur - j));}//每次试探下一个新的元素时,更新当前已知最大带宽
}
if(tmp_max >= min_wid) {vis[i] = false; return;}//当不可能出现更优解时,剪枝
dfs(cur + 1, tmp_max, a, cnt + 1);
vis[i] = false;//用完后撤销访问标记
}
}
}
int main() {
string line;
while(getline(cin, line)) {
if(line[0] == '#') return 0;
min_wid = INF;
memset(id, 0, sizeof(id));
memset(G, 0, sizeof(G));
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
n = 0;
char rever[10] = {0};
for(int i = 'A'; i <= 'Z'; i++) {//printf("i = %c, n - 1 = %d\n", i, n - 1);
if(line.find(i) != string::npos) {
id[i] = n++;
rever[n - 1] = i;
}
}
for(int i = 0; i < line.size(); i++) if(line[i] == ';') line[i] = ' ';
stringstream ss(line);
string conne;
while(ss >> conne) {
for(int i = 2; i < conne.size(); i++) {
int x = id[conne[0]], y = id[conne[i]];
G[x][y] = G[y][x] = 1;
}
}//记录出现的字母数
dfs(0, 0, a, 0);//暂时默认不会隔着字典序出现字母
for(int i = 0; i < n; i++) printf("%c ", rever[ans[i]]);
printf("-> %d\n", min_wid);
}
return 0;
}
/*
A:FB;B:GC;D:GC;F:AGH;E:HD
#
*/