/*
ID:limosunyue
Name:Karen
Lang:C++
Date:Mar.9,2012
*/
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX_NODE 2100
#define MAX_EDGE 4000000
#define INF 99999999
int arr_list[MAX_NODE][MAX_NODE];
struct Edge
{
int pointer;
int lowcost;
int flag;
}edge[MAX_EDGE];
int cal_distance(char a,char b)
{
int dis=0;
for(int i=0;i<7;i++)
if(a[i]!=b[i])
dis++;
return dis;
}
int prim(int n)
{
int i,j,k=1,flag;
int min,sum=0;
j=1;
for(i=1;i<=n;i++)
if(i!=j)
{
edge[i].pointer=i;
edge[i].lowcost=arr_list[j][i];
edge[i].flag=0;
}
edge[j].flag=1;
edge[j].lowcost=0;
for(i=2;i<=n;i++)
{
k=1;
min=INF;
flag=0;
for(j=2;j<=n;j++)
{
if(edge[j].flag==0&&edge[j].lowcost<min)
{
k=j;
min=edge[j].lowcost;
flag=1;
}
}
if(!flag) return -1;
sum+=min;
edge[k].flag=1;
for(j=2;j<=n;j++)
if(edge[j].flag==0&&arr_list[k][j]<edge[j].lowcost)
{
edge[j].pointer=k;
edge[j].lowcost=arr_list[k][j];
}
}
return sum;
}
int main()
{
int n,i,j,ans;
char data[2010][7];
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(i=1;i<=n;i++)
scanf("%s",data[i]);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
arr_list[i][j]=arr_list[j][i]=INF,arr_list[i][i]=0;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
arr_list[i][j]=arr_list[j][i]=cal_distance(data[i],data[j]);//之前由于把图当做单向的,所以wrong了
}
}
ans=prim(n);
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}