#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
const int N=300005;
int deep[N],f[N][25],n,m,a1,b1,w[N],ans[N];
int s[N],t[N],len[N],lca[N],bac[N*2],num[N];
int had[N],to[N*2],nxt[N*2],p;
vector<int> v1[N],v2[N],v3[N];
void add(int x,int y)
{
nxt[++p]=had[x];
to[p]=y;
had[x]=p;
}
void deal_first(int u,int fa)
{
deep[u]=deep[fa]+1;
f[u][0]=fa;
for(int i=1;i<=20;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=had[u];i;i=nxt[i])
{
int v=to[i];
if(v==fa) continue;
deal_first(v,u);
}
}
int LCA(int x,int y)
{
if(deep[x]<deep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(deep[f[x][i]]>=deep[y]) x=f[x][i];
if(x==y) return x;
for(int i=20;i>=0;i--)
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
return f[x][0];
}
void dfs_up(int u,int fa)
{
int now=bac[w[u]+deep[u]+N];
for(int i=had[u];i;i=nxt[i])
{
int v=to[i];
if(v==fa) continue;
dfs_up(v,u);
}
bac[deep[u]+N]+=num[u];
ans[u]+=bac[w[u]+deep[u]+N]-now;
int cnt=v1[u].size();
for(int i=0;i<cnt;i++)
bac[deep[v1[u][i]]+N]--;
}
void dfs_down(int u,int fa)
{
int now=bac[deep[u]-w[u]+N];
for(int i=had[u];i;i=nxt[i])
{
int v=to[i];
if(v==fa) continue;
dfs_down(v,u);
}
int cnt=v2[u].size();
for(int i=0;i<cnt;i++)
bac[deep[u]-v2[u][i]+N]++;
ans[u]+=bac[deep[u]-w[u]+N]-now;
cnt=v3[u].size();
for(int i=0;i<cnt;i++) bac[v3[u][i]+N]--;
}
int main()
{
n=read(); m=read();
for(int i=1;i<n;i++)
{
a1=read(); b1=read();
add(a1,b1); add(b1,a1);
}
for(int i=1;i<=n;i++) w[i]=read();
deal_first(1,0);
for(int i=1;i<=m;i++)
{
s[i]=read();
t[i]=read();
lca[i]=LCA(s[i],t[i]);
len[i]=deep[s[i]]+deep[t[i]]-deep[lca[i]]*2;
num[s[i]]++;
v1[lca[i]].push_back(s[i]);
v2[t[i]].push_back(len[i]);
v3[lca[i]].push_back(deep[t[i]]-len[i]);
}
dfs_up(1,0);
dfs_down(1,0);
for(int i=1;i<=m;i++)
if(deep[s[i]]==w[lca[i]]+deep[lca[i]])
ans[lca[i]]--;
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}