#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x3f3f3f3f
using namespace std;
const LL MAXN=1e7+10;
char Num[MAXN],Temp[8][MAXN];
LL Len,Str[8],Total,Test;
LL Sa[MAXN],Rank[MAXN],Height[MAXN],Bar[122],Sec[MAXN];
LL Next[MAXN],Col[MAXN];
LL Tree[MAXN<<2],Ans=-INF;
LL Last[130];
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline void Clean() {
Len=0; Ans=-INF;
Cl(Tree,0x3f); Cl(Sa,0); Cl(Rank,0); Cl(Height,0); Cl(Next,0);
Cl(Col,0); Cl(Last,0); Cl(Bar,0); Cl(Str,0);
}
inline void Get_Sa() {
LL Limit=122;
FOR(i,1,Len) Bar[Rank[i]=Num[i]]++;
FOR(i,2,Limit) Bar[i]+=Bar[i-1];
BOR(i,Len,1) Sa[Bar[Rank[i]]--]=i;
for(LL k=1;k<=Len;k<<=1) {
LL Cnt=0; Cl(Bar,0);
FOR(i,Len-k+1,Len) Sec[++Cnt]=i;
FOR(i,1,Len) if(Sa[i]>k) Sec[++Cnt]=Sa[i]-k;
FOR(i,1,Len) ++Bar[Rank[i]];
FOR(i,2,Limit) Bar[i]+=Bar[i-1];
BOR(i,Len,1) Sa[Bar[Rank[Sec[i]]]--]=Sec[i];
swap(Rank,Sec);
Rank[Sa[1]]=1; Cnt=1;
FOR(i,2,Len) Rank[Sa[i]]=(Sec[Sa[i]]==Sec[Sa[i-1]] && Sec[Sa[i]+k]==Sec[Sa[i-1]+k]) ? Cnt : ++Cnt;
if(Cnt==Len) break;
Limit=Cnt;
}
}
inline void Get_Height() {
LL Loc=0;
FOR(i,1,Len) {
if(Loc) Loc--;
while(Num[i+Loc]==Num[Sa[Rank[i]-1]+Loc]) Loc++;
Height[Rank[i]]=Loc;
}
}
inline void Init() {
BOR(i,Len,1) {
if(Num[Sa[i]]>=(char)100) continue;
if(Last[Col[Sa[i]]]) Next[i]=Last[Col[Sa[i]]],Last[Col[Sa[i]]]=i;
else Last[Col[Sa[i]]]=i;
}
}
inline void Push_up(LL X) {
Tree[X]=min(Tree[Lson],Tree[Rson]);
}
inline void Build(LL L,LL R,LL X) {
if(L==R) { Tree[X]=Height[L]; return ; }
LL Mid=(L+R)>>1;
Build(L,Mid,Lson); Build(Mid+1,R,Rson);
Push_up(X);
}
inline LL Get(LL L,LL R,LL From,LL To,LL X) {
if(L>=From && R<=To) { return Tree[X]; }
LL Mid=(L+R)>>1,Res=INF;
if(From<=Mid) Res=min(Res,Get(L,Mid,From,To,Lson));
if(To>Mid) Res=min(Res,Get(Mid+1,R,From,To,Rson));
return Res;
}
inline void Solve() {
LL Loc[10],Cnt=0,Rmax=0,Lmin=0;
Cl(Loc,0);
FOR(i,1,Len) {
if(Num[Sa[i]]>=(char)100) continue;
if(!Loc[Col[Sa[i]]]) Loc[Col[Sa[i]]]=i,Cnt++;
else continue;
if(Cnt==Total) break;
}
while(true) {
LL Temp;
bool Jud=false;
Lmin=INF; Rmax=-INF;
FOR(i,1,Total) { if(Loc[i]<Lmin) Lmin=Loc[i],Temp=i; }
FOR(i,1,Total) { if(Loc[i]>Rmax) Rmax=Loc[i]; }
Loc[Temp]=Next[Loc[Temp]];
Ans=max(Ans,Get(1,Len,Lmin+1,Rmax,1));
FOR(i,1,Total) if(Loc[i]==0) { Jud=true; break; }
if(Jud) break;
}
}
int main() {
scanf("%lld",&Test);
while(Test--) {
scanf("%lld",&Total);
Clean();
FOR(i,1,Total) {
scanf("%s",Temp[i]+1);
Str[i]=strlen(Temp[i]+1);
if(i==1) Num[Len]=(char)(100+i);
else Num[++Len]=(char)(100+i);
FOR(j,Len+1,Len+Str[i]) Num[j]=Temp[i][j-Len];
Len+=Str[i];
FOR(j,Len-Str[i]+1,Len) Col[j]=i;
}
Get_Sa(); Get_Height(); Init();
Build(1,Len,1);
Solve();
printf("%lld\n",Ans);
}
system("pause");
return 0;
}