#include <bits/stdc++.h>
using namespace std;
struct node1
{
int v;
int next;
};
struct node2
{
int x;
int y;
int dis;
};
map <string,int> mp;
node1 edge[200010];
node2 pre[100010];
int dp[100010][20];
int first[100010],clr[100010],deep[100010];
int n,q,num;
void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
return;
}
void dfs(int cur,int fa)
{
int i,v;
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa)
{
dp[v][0]=cur;
deep[v]=deep[cur]+1;
dfs(v,cur);
}
}
return;
}
void solve()
{
int i,j;
dp[1][0]=0;
deep[1]=1;
dfs(1,0);
for(j=1;(1<<j)<=n;j++)
{
for(i=1;i<=n;i++)
{
dp[i][j]=dp[dp[i][j-1]][j-1];
}
}
return;
}
int getlca(int u,int v)
{
int i;
if(deep[u]<deep[v]) swap(u,v);
for(i=log2(n);i>=0;i--)
{
if(deep[dp[u][i]]>=deep[v])
{
u=dp[u][i];
}
}
if(u==v) return u;
for(i=log2(n);i>=0;i--)
{
if(dp[u][i]!=dp[v][i])
{
u=dp[u][i];
v=dp[v][i];
}
}
return dp[u][0];
}
int main()
{
string s1,s2;
int i,u,v,lca,cnt,ans;
int lca1,lca2;
while(scanf("%d%d",&n,&q)!=EOF)
{
mp.clear();
cnt=0;
for(i=1;i<=n;i++)
{
cin>>s1;
if(mp[s1]==0) mp[s1]=++cnt;
clr[i]=mp[s1];
}
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
solve();
memset(pre,-1,sizeof(pre));
for(i=1;i<=n;i++)
{
if(pre[clr[i]].x==-1) pre[clr[i]].x=i,pre[clr[i]].y=i,pre[clr[i]].dis=0;
else if(pre[clr[i]].x==pre[clr[i]].y)
{
pre[clr[i]].y=i;
lca=getlca(pre[clr[i]].x,pre[clr[i]].y);
pre[clr[i]].dis=deep[pre[clr[i]].x]+deep[pre[clr[i]].y]-2*deep[lca];
}
else
{
lca1=getlca(i,pre[clr[i]].x);
lca2=getlca(i,pre[clr[i]].y);
if(pre[clr[i]].dis<max(deep[i]+deep[pre[clr[i]].x]-2*deep[lca1],deep[i]+deep[pre[clr[i]].y]-2*deep[lca2]))
{
if(deep[i]+deep[pre[clr[i]].x]-2*deep[lca1]>deep[i]+deep[pre[clr[i]].y]-2*deep[lca2])
{
pre[clr[i]].y=i;
pre[clr[i]].dis=deep[i]+deep[pre[clr[i]].x]-2*deep[lca1];
}
else
{
pre[clr[i]].x=i;
pre[clr[i]].dis=deep[i]+deep[pre[clr[i]].y]-2*deep[lca2];
}
}
}
}
//printf("***%d***\n",cnt);
//for(i=1;i<=cnt;i++) printf("*%d %d %d*\n",pre[i].x,pre[i].y,pre[i].dis);
while(q--)
{
cin>>s1>>s2;
u=mp[s1],v=mp[s2];
if(u==0||v==0) printf("-1\n");
else if(u==v) printf("%d\n",pre[u].dis+1);
else
{
//printf("***%d %d %d %d***\n",u,v,pre[v].x,pre[v].y);
//ans=max(pre[u].dis,pre[v].dis);
ans=0;
lca=getlca(pre[u].x,pre[v].x);
ans=max(ans,deep[pre[u].x]+deep[pre[v].x]-2*deep[lca]);
lca=getlca(pre[u].x,pre[v].y);
ans=max(ans,deep[pre[u].x]+deep[pre[v].y]-2*deep[lca]);
lca=getlca(pre[u].y,pre[v].x);
ans=max(ans,deep[pre[u].y]+deep[pre[v].x]-2*deep[lca]);
lca=getlca(pre[u].y,pre[v].y);
ans=max(ans,deep[pre[u].y]+deep[pre[v].y]-2*deep[lca]);
printf("%d\n",ans+1);
}
}
}
return 0;
}