#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
const int N = 2e5+5;
const int LG = 19;
vector<int> adj[N],posi[N];
int C[N],sz[N],del[N],vis[N];
int n,K;
void dfs(int u,int p){
sz[u]=1;
for(int v:adj[u]){
if(v==p || del[v]) continue;
dfs(v,u);
sz[u] += sz[v];
}
}
int findcent(int u,int p,int need){
for(int v:adj[u]){
if(v==p || del[v]) continue;
if(sz[v]>need/2) return findcent(v,u,need);
}
return u;
}
int cnt[N],par[N];
void cle(int u,int p){
cnt[C[u]]=0;
vis[C[u]]=0;
par[u]=p;
for(int v:adj[u]){
if(v==p || del[v]) continue;
cle(v,u);
}
}
void dfs1(int u,int p){
cnt[C[u]]++;
for(int v:adj[u]){
if(v==p || del[v]) continue;
dfs1(v,u);
}
}
int ans=1e9;
void decomp(int u,int p){
dfs(u,0);
u=findcent(u,0,sz[u]);
del[u]=1;
cle(u,0);
dfs1(u,0);
queue<int> q;
int res=0;
q.push(C[u]);
//cerr<<u<<'\n';
while(!q.empty()){
int col=q.front();
q.pop();
if(cnt[col] != posi[col].size()){
res=1e9;
break;
}
if(vis[col]) continue;
vis[col]=1;
res++;
for(int v:posi[col]){
if(par[v]) q.push(C[par[v]]);
}
}
ans=min(ans,res-1);
for(int v:adj[u]){
if(v==p || del[v]) continue;
decomp(v,u);
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
//freopen(task".out","w",stdout);
}
cin>>n>>K;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1;i<=n;i++){
cin>>C[i];
posi[C[i]].push_back(i);
}
decomp(1,0);
cout<<ans<<'\n';
}