#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<algorithm>
#include<ctime>
#include<cstdlib>
using namespace std;
int Cat,x11,y11,maxi,Te,l,DD,TT,x,y,i,n,ap[100009],t[100009],T[100009][18],D[100009][18],pw[100009],h[100009],V[100009];
char a[100009];
vector < int > muc[100009],v[100009];
vector < int > :: iterator it;
void dfs(int nod)
{
    vector < int > :: iterator it;
    for(it=muc[nod].begin();it!=muc[nod].end();it++)
        if(ap[*it]==0)
        {
            ap[*it]=1;
            t[*it]=nod;
            h[*it]=h[nod]+1;
            v[nod].push_back(*it);
            dfs(*it);
        }
}
void Dp(int nod)
{
    vector < int > :: iterator it;
    if(nod!=1)
    {
        V[nod]=(V[t[nod]]+1LL*pw[h[nod]-1]*a[nod])%y;
        T[nod][0]=t[nod];
        D[nod][0]=a[t[nod]];
        for(i=1;(1<<i)<h[nod];i++)
        {
            T[nod][i]=T[T[nod][i-1]][i-1];
            D[nod][i]=(D[nod][i-1]+1LL*D[T[nod][i-1]][i-1]*pw[1<<(i-1)])%y;
        }
    }
    for(it=v[nod].begin();it!=v[nod].end();it++)
        Dp(*it);
}
void CC(int nod,int poz)
{
    DD=a[nod];
    TT=nod;
    l=1;
    for(int i=16;i>=0;i--)
        if(poz&(1<<i))
        {
            DD=(DD+1LL*pw[l]*D[TT][i])%y;
            TT=T[TT][i];
            l+=1<<i;
        }
}
int main()
{
//freopen("input","r",stdin);
//freopen("output","w",stdout);
scanf("%d",&Te);
x=666013;
y=1000007;
pw[0]=1;
for(i=1;i<=100000;i++)
    pw[i]=(1LL*pw[i-1]*x)%y;
while(Te)
{
    Te--;
    scanf("%d\n",&n);
    gets(a+1);
    for(i=1;i<=n;i++)
        v[i].clear(),muc[i].clear(),ap[i]=0;
    for(i=1;i<n;i++)
    {
        scanf("%d",&x11);
        scanf("%d",&y11);
        muc[x11].push_back(y11);
        muc[y11].push_back(x11);
    }
    ap[1]=h[1]=1;
    dfs(1);
    V[1]=a[1];
    Dp(1);
    maxi=1;
    for(i=1;i<=n;i++)
    {
        if(h[i]%2==0)
        {
            Cat=h[i]/2-1;
            CC(i,Cat);
            if(DD==V[t[TT]]&&h[i]>maxi) maxi=h[i];
        }
        else
        {
            Cat=h[i]/2;
            CC(i,Cat);
            if(DD==V[TT]&&h[i]>maxi) maxi=h[i];
        }
    }
    printf("%d\n",maxi);
}
return 0;
}