//题意:要求 sigma(d(t0,tx))最小 &&任意两个点之间均有路径
//则所有点处于同一个连通分量 ,边权和最小,即求出最小生成树即可
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=2e3+20;
int n,g[N][N];
char s[N][N];
int cal(int a,int b)
{
int l=strlen(s[a]+1);
int cnt=0;
for(int k=1;k<=l;k++)
{
if(s[a][k]!=s[b][k])
cnt++;
}
return cnt;
}
int ans,vis[N],d[N];//d[i] 点i到生成树距离
void prim()//每次把一个点加入生成树花费最小
{
ans=d[1]=0;
for(int i=1;i<=n;i++)
d[i]=g[1][i];
vis[1]=1;
while(1)
{
int u=-1;//找到当前离生成树最近点
for(int i=1;i<=n;i++)
{
if(d[i]&&(u==-1||d[i]<d[u]))
u=i;
}
if(u==-1)
break;
ans+=d[u];
d[u]=0;//
for(int i=1;i<=n;i++)
{
if(d[i]>d[u]+g[u][i])
d[i]=d[u]+g[u][i];
}
}
}
int main()
{
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
//求任意两点间距离
g[i][j]=cal(i,j);
}
}
prim();
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}