#include <stdio.h>
#include <string.h>
char s[101][101];
int minIndex;
char t[101];
/*begin为起始位置的下标、end为结束位置的下标,num为字符数组的元素个数*/
int match(int begin,int end,int num){
int i,j,k,r,n;
int flag;
for(n=0;n<num;n++){
for(flag=0,k=0;!flag && k<strlen(s[n]);k++){
/*原序字符串的匹配*/
for(i=k,j=begin;j<=end && s[minIndex][j]==s[n][i];j++,i++)
;
/*逆序字符串的匹配*/
for(i=k,r=end;r>=begin && s[minIndex][r]==s[n][i];r--,i++)
;
if(j==end+1 || r==begin-1) flag=1;
}
if(!flag) return 0;
}
return 1;
}
int main(){
int cases,i,j,n,maxlen;
scanf("%d",&cases);
while(cases--){
maxlen=0;
scanf("%d",&n);
/*minLen保存最短字符串的长度,而minIndex保存最短字符串的下标*/
int minLen=100;
minIndex=0;
for(i=0;i<n;i++){
scanf("%s",s[i]);
if(strlen(s[i])<minLen){
minLen=strlen(s[i]);
minIndex=i;
}
}
/*下面的循环是搜索的关键,j初始化成所有字符串中最短字符串的长度,每次递减,
这样,搜到的第一个满足条件的长度即为最长的长度,可用goto跳出两重循环*/
for(j=minLen;j>0;j--){
for(i=0;i<=minLen-j;i++){
if(match(i,i+j-1,n)){
maxlen=j;
goto end;
}
}
}
end: printf("%d/n",maxlen);
}
}