/*
题目不难,一次AC
题意:将图中各节点排在一条线上,依次找出各节点到相邻节点的最长距离,各节点最长距离的最大值即为带宽。输出带宽最小的序列,和带宽的值,如果出现多种情况,输出字典序最小的那种。
思路:深搜+回溯+状态存储
*/
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
char line[100];
bool G[30][30],visit[30];
char node[10],A[10],res[10];
int m;
int ans;
int cmp(const void *a,const void *b)
{
char *pa=(char *)a;
char *pb=(char *)b;
return *pa-*pb;
}
void dfs(int cur,int dep)
{
if(dep==m)
{
int temp=0;
for(int i=0;i<m;i++)
{
int k=0;
int a=A[i]-'A';
for(int j=0;j<m;j++)
if(i!=j)
{
int b=A[j]-'A';
if(G[a][b])
{
if(abs(i-j)>k)
k=abs(i-j);
}
}
if(k>temp)
temp=k;
}
if(temp<ans)
{
ans=temp;
memcpy(res,A,sizeof(A));
}
return;
}
for(int i=0;i<m;i++)
{
if(!visit[i])//排列式搜索,所以不需要G[][]值为1.
{
A[dep]=node[i];
visit[i]=1;
dfs(i,dep+1);
visit[i]=0;
}
}
}
int main()
{
//freopen("data.in","r",stdin);
while(1)
{
gets(line);
if(line[0]=='#') break;
int len=strlen(line);
int flag=0;
m=0;
memset(G,0,sizeof(G));
memset(visit,0,sizeof(visit));
int a,b;
for(int i=0;i<len;i++)
{
if(line[i]==';')
{
flag=0;
continue;
}
else if(line[i]==':')
{
flag=1;
continue;
}
else if(!visit[line[i]-'A'])
{
visit[line[i]-'A']=1;
node[m++]=line[i];
}
if(flag==0)
a=line[i]-'A';
else if(flag==1)
{
b=line[i]-'A';
G[a][b]=G[b][a]=1;
}
}
ans=1e9;
qsort(node,m,sizeof(node[0]),cmp);
memset(visit,0,sizeof(visit));
for(int i=0;i<m;i++)
{
A[0]=node[i];
visit[i]=1;
dfs(i,1);
visit[i]=0;
}
for(int i=0;i<m;i++)
printf("%c ",res[i]);
printf("-> %d\n",ans);
}
return 0;
}