#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
vector<int> h1[N],h2[N]; //邻接表
int a[N],b[N],ans;
//同时遍历两棵树的dfs,先遍历完第一颗树的一层子节点,用map存权重
//第二棵树遍历子节点时根据条件判断是否进入遍历两棵树的下一层
//第一颗树的当前节点 当前节点的父节点 第二课树同理 d表示两棵树符合条件的最大深度
void dfs(int pn,int fan,int pm,int fam,int d)
{
ans=max(ans,d);
unordered_map<int,int>mp;
for(auto t:h1[pn]) //遍历子节点
if(t!=fan) //防止回头遍历
mp[a[t]]=t; //用map存入权重
for(auto t:h2[pm])
if(t!=fam)
if(mp.count(b[t])) //查找另一颗树上是否有相同权重的节点
dfs(mp[b[t]],pn,t,pm,d+1);
}
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",a+i);
for(int i=1;i<=m;i++) scanf("%d",b+i);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
//题目中没说方向,就是双向边
h1[x].push_back(y);
h1[y].push_back(x);
}
for(int i=1;i<m;i++){
int x,y;scanf("%d%d",&x,&y);
//题目中没说方向,就是双向边
h2[x].push_back(y);
h2[y].push_back(x);
}
if(a[1]!=b[1]){
cout<<0;
return 0;
}
dfs(1,0,1,0,1);
cout<<ans;
return 0;
}