#include<bits/stdc++.h>
const int N=700001;
using namespace std;
int ls[N<<2], rs[N<<2], tr[N*30];
int f[N][20], head[N], dep[N], son[N];
int sum[N], s[N], t[N], w[N], ans[N];
int n, m, rt[N], cnt, edgenum;
struct edge{
int to, next;
}edge[N<<1];
void add_edge(int x,int y)
{
edge[++edgenum].to=y;
edge[edgenum].next=head[x];
head[x]=edgenum;
}
void dfs(int u, int fa)
{
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(int i=1;i<=18;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa)
{
continue;
}
dfs(v, u);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x, y);
}
for(int i=18;i>=0;i--)
{
if(dep[f[x][i]]>=dep[y])
{
x=f[x][i];
}
}
if(x==y)
{
return x;
}
for(int i=18;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i], y=f[y][i];
}
}
return f[x][0];
}
void pushup(int id)
{
tr[id]=tr[ls[id]]+tr[rs[id]];
}
int add(int a,int x,int y,int p,int val)
{
if(!a) a=++cnt;
if(x==y)
{
tr[a]+=val;
return a;
}
int mid=(x+y)>>1;
if(p<=mid)
{
ls[a]=add(ls[a], x, mid, p, val);
}
else rs[a]=add(rs[a], mid+1, y, p, val);
pushup(a);
return a;
}
int merge(int a,int b,int x,int y)
{
if(!a) return b;
if(!b) return a;
if(x==y)
{
tr[a]+=tr[b];
t[a]=x;
return a;
}
int mid=(x+y)>>1;
ls[a]=merge(ls[a], ls[b], x, mid);
rs[a]=merge(rs[a], rs[b], mid+1, y);
// pushup(a);
return a;
}
int query(int id,int l,int r,int v)
{
if(!id) return 0;
if(l==r)
{
return tr[id];
}
int mid=(l+r)>>1;
if(v<=mid)
{
return query(ls[id], l, mid, v);
}
else
{
return query(rs[id], mid+1, r, v);
}
}
void dfs3(int u)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v!=f[u][0])
{
dfs3(v);
rt[u]=merge(rt[u],rt[v],1,N<<1);
}
}
if(w[u]&&n+dep[u]+w[u]<=2*n)
{
ans[u]+=query(rt[u], 1, N<<1, n+dep[u]+w[u]);
}
ans[u]+=query(rt[u], 1, N<<1, n+dep[u]-w[u]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
int u, v;
cin>>u>>v;
add_edge(u, v);
add_edge(v, u);
}
dep[1]=1;
dfs(1, 0);
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
for(int i=1;i<=m;i++)
{
cin>>s[i]>>t[i];
}
for(int i=1;i<=m;i++)
{
int u=lca(s[i],t[i]);
rt[s[i]]=add(rt[s[i]], 1, N<<1, n+dep[s[i]], 1);
rt[t[i]]=add(rt[t[i]], 1, N<<1, n+dep[u]*2-dep[s[i]], 1);
rt[u]=add(rt[u], 1, N<<1, n+dep[s[i]], -1);
rt[f[u][0]]=add(rt[f[u][0]], 1, N<<1, n+dep[u]*2-dep[s[i]], -1);
}
dfs3(1);
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<" ";
}
return 0;
}