#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#include <cstring>
#include <memory.h>
#define Nmax 100005
using namespace std;
int val[Nmax],weight[Nmax],lantz[Nmax];
int N,Q;
bitset<Nmax>used,fol;
vector<int> G[Nmax];
class cmp{
public:
bool operator()(const int x,const int y)const
{
return weight[x] < weight[y];
}
};
void read()
{
int a,b;
scanf("%d%d",&N,&Q);
for(int i = 1; i <= N; ++i)
scanf("%d",&val[i]);
for(int i = 1; i < N; ++i){
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
memset(weight,-1,sizeof(weight));
for(int i = 2; i <= N; ++i)
if(G[i].size() == 1)
weight[i] = 0;/// pot doar ajunge in el
}
void DFS(int k)
{
used[k] = 1;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it])
DFS(*it);
int s = 0;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
s += weight[*it] + 1;
weight[k] = s;
}
void get_weigh()
{
DFS(1);
for(int i = 1; i <= N; ++i)
sort(G[i].begin(),G[i].end(),cmp());
used = 0;
}
int nrl = 1;
void get_links(int k)
{
used[k] = 1;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it])
DFS(*it);
}
int main()
{
freopen("heavypath.in","r",stdin);
freopen("heavypath.out","w",stdout);
read();
get_weigh();
get_links(1);
return 0;
}