#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
const int N=200020,M=1e8+10;
int n,m;
int idx,cnt;
int h1[N],h2[N],e1[2*N],e2[2*N],ne1[2*N],ne2[2*N],w1[M],w2[M];
void add1(int x,int y)
{
e1[idx]=y;
ne1[idx]=h1[x];
h1[x]=idx++;
}
void add2(int x,int y)
{
e2[idx]=y;
ne2[idx]=h2[x];
h2[x]=idx++;
}
int dfs(int u1,int u2,int fa1,int fa2)
{
int res = 0;
unordered_map<int, int> hs;
for (int i = h1[u1]; i!=-1; i = ne1[i])
{
int j = e1[i];
if (j == fa1) continue;
hs[w1[j]] = j;
}
for (int i = h2[u2]; i!=-1; i = ne2[i]){
int j = e2[i];
if (j == fa2) continue;
if (hs.count(w2[j])){
res = max(dfs(hs[w2[j]], j, u1, u2), res);
}
}
return res + 1;
}
int main()
{
memset(h1,-1,sizeof h1);
memset(h2,-1,sizeof h2);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&w1[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&w2[i]);
}
for(int i=0;i<n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add1(a,b);
add1(b,a);
}
idx=0;
for(int i=0;i<m-1;i++)
{
int c,d;
scanf("%d%d",&c,&d);
add2(c,d);
add2(d,c);
}
if(w1[1]==w2[1])
{
cnt=dfs(1,1,-1,-1);
}
cout<<cnt<<endl;
return 0;
}