#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
const int maxn=2e5;
int n,k;
int c[maxn+2];
vector<int>adj[maxn+2];
vector<int>elem[maxn+2];
int sub[maxn+2]; bool vis[maxn+2];
bool col[maxn+2];
int cnt[maxn+2];
void dfs(int cur,int par){
sub[cur]=1;
col[c[cur]]=false; cnt[c[cur]]=0;
for(auto x : adj[cur]){
if(x==par || vis[x])continue;
dfs(x,cur);
sub[cur]+=sub[x];
}
}
int centro(int cur,int par,int sz){
for(auto x : adj[cur]){
if(x==par || vis[x])continue;
if(sub[x]>=sz/2){
return centro(x,cur,sz);
}
}
return cur;
}
int par[maxn+2];
void build(int cur,int p){
cnt[c[cur]]++;
par[cur]=p;
for(auto x : adj[cur]){
if(x==p || vis[x])continue;
build(x,cur);
}
}
int tmp=0;
queue<int>qq;
void msk(int apa){
if(col[apa])return;
col[apa]=true; tmp++;
if(cnt[apa]!=elem[apa].size()){
tmp=1e9; return;
}
for(auto x : elem[apa]){
qq.push(x);
}
}
int ans;
void solve(int cur,int p){
dfs(cur,p);
int root=centro(cur,p,sub[cur]);
build(root,0);
tmp=0;
msk(c[root]);
while(qq.size()){
int hmm=qq.front(); qq.pop();
if(par[hmm]){
msk(c[par[hmm]]);
}
}
//cout<<tmp<<" "<<cur<<endl;
ans=min(ans,tmp-1);
vis[root]=true;
for(auto x : adj[root]){
if(vis[x])continue;
solve(x,root);
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int q=1;q<n;q++){
int u,v;
cin>>u>>v;
adj[u].pb(v); adj[v].pb(u);
}
for(int q=1;q<=n;q++){
cin>>c[q];
elem[c[q]].pb(q);
}
ans=k-1;
solve(1,0);
cout<<ans<<endl;
}