import collections



n,q=list(map(int,input().split()))

cnt=[0]*(n+1)

g=[[] for _ in range(n+1)]

for _ in range(n-1): #木グラフの隣接リストを作成

 a,b=list(map(int,input().split()))

 g[a].append(b)

 g[b].append(a)

for _ in range(q): #各頂点についてcount[v]を計算

 v,val=list(map(int,input().split()))

 cnt[v]+=val

q=collections.deque()

q.append(1) #DFSのスタックによる実装、まずスタックに始点1を積む

checked=[0]*(n+1) #各頂点を見たかどうかのフラグを持っておく

while q:

 v=q.pop()

 checked[v]=1 #頂点を見たかどうかのフラグを更新する

 for u in g[v]:

   if checked[u]==1: #vの子ノードuについて、まだ見ていない頂点であればcount[u]をcount[u]+=count[v]として更新する

     continue

   cnt[u]+=cnt[v]

   q.append(u) #スタックに子ノードuを積む

print((*cnt[1:])) #各頂点のcountが答えとなる
import collections

#def input():

#    return sys.stdin.readline()[:-1]

N , Q = list(map(int,input().split()))

graph = [[] for _ in range(N+1)]

point = [0] * (N+1)

for _ in range(N - 1):

    a , b = list(map(int,input().split()))

    graph[a].append(b)

    graph[b].append(a)

#print(graph)

for _ in range(Q):

    a , b = list(map(int,input().split()))

    #a = a - 1

    point[a] += b

q=collections.deque()

q.append(1)

checked=[0]*(N+1)



while q:

  v=q.pop()

  checked[v]=1

  

  for u in graph[v]:

    if checked[u]==1:

      continue

      

    point[u]+=point[v]

    q.append(u)

print((*point[1:]))
import collections

n, q = list(map(int, input().split()))
cnt = [0] * (n + 1)
g = [[] for _ in range(n + 1)]
for _ in range(n - 1):  # 木グラフの隣接リストを作成
    a, b = list(map(int, input().split()))
    g[a].append(b)
    g[b].append(a)
for _ in range(q):  # 各頂点についてcount[v]を計算
    v, val = list(map(int, input().split()))
    cnt[v] += val
q = collections.deque()
q.append(1)  # DFSのスタックによる実装、まずスタックに始点1を積む
checked = [0] * (n + 1)  # 各頂点を見たかどうかのフラグを持っておく
while q:
    v = q.pop()
    checked[v] = 1  # 頂点を見たかどうかのフラグを更新する
    for u in g[v]:
        if (
            checked[u] == 1
        ):  # vの子ノードuについて、まだ見ていない頂点であればcount[u]をcount[u]+=count[v]として更新する
            continue
        cnt[u] += cnt[v]
        q.append(u)  # スタックに子ノードuを積む
print((*cnt[1:]))  # 各頂点のcountが答えとなる

import collections

# def input():
#    return sys.stdin.readline()[:-1]
N, Q = list(map(int, input().split()))
graph = [[] for _ in range(N + 1)]
point = [0] * (N + 1)
for _ in range(N - 1):
    a, b = list(map(int, input().split()))
    graph[a].append(b)
    graph[b].append(a)
# print(graph)
for _ in range(Q):
    a, b = list(map(int, input().split()))
    # a = a - 1
    point[a] += b
q = collections.deque()
q.append(1)
checked = [0] * (N + 1)
while q:
    v = q.pop()
    checked[v] = 1
    for u in graph[v]:
        if checked[u] == 1:
            continue
        point[u] += point[v]
        q.append(u)
print((*point[1:]))

-n, q = list(map(int, input().split())) -cnt = [0] * (n + 1) -g = [[] for _ in range(n + 1)] -for _ in range(n - 1):  # 木グラフの隣接リストを作成 +# def input(): +#    return sys.stdin.readline()[:-1] +N, Q = list(map(int, input().split())) +graph = [[] for _ in range(N + 1)] +point = [0] * (N + 1) +for _ in range(N - 1): -    g[a].append(b) -    g[b].append(a) -for _ in range(q):  # 各頂点についてcount[v]を計算 -    v, val = list(map(int, input().split())) -    cnt[v] += val +    graph[a].append(b) +    graph[b].append(a) +# print(graph) +for _ in range(Q): +    a, b = list(map(int, input().split())) +    # a = a - 1 +    point[a] += b -q.append(1)  # DFSのスタックによる実装、まずスタックに始点1を積む -checked = [0] * (n + 1)  # 各頂点を見たかどうかのフラグを持っておく +q.append(1) +checked = [0] * (N + 1) -    checked[v] = 1  # 頂点を見たかどうかのフラグを更新する -    for u in g[v]: -        if ( -            checked[u] == 1 -        ):  # vの子ノードuについて、まだ見ていない頂点であればcount[u]をcount[u]+=count[v]として更新する +    checked[v] = 1 +    for u in graph[v]: +        if checked[u] == 1: -        cnt[u] += cnt[v] -        q.append(u)  # スタックに子ノードuを積む -print((*cnt[1:]))  # 各頂点のcountが答えとなる +        point[u] += point[v] +        q.append(u) +print((*point[1:]))