You are given a weighted tree consisting of n vertices. Recall that a tree is a connected graph without cycles. Vertices u_i and v_i are connected by an edge with weight w_i.

You are given m queries. The i-th query is given as an integer q_i. In this query you need to calculate the number of pairs of vertices (u, v) (u < v) such that the maximum weight of an edge on a simple path between u and v doesn't exceed q_i.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 2 ⋅ 10^5) — the number of vertices in the tree and the number of queries.

Each of the next n - 1 lines describes an edge of the tree. Edge i is denoted by three integers u_i, v_i and w_i — the labels of vertices it connects (1 ≤ u_i, v_i ≤ n, u_i ≠ v_i) and the weight of the edge (1 ≤ w_i ≤ 2 ⋅ 10^5). It is guaranteed that the given edges form a tree.

The last line of the input contains m integers q_1, q_2, ..., q_m (1 ≤ q_i ≤ 2 ⋅ 10^5), where q_i is the maximum weight of an edge in the i-th query.

Output

Print m integers — the answers to the queries. The i-th value should be equal to the number of pairs of vertices (u, v) (u < v) such that the maximum weight of an edge on a simple path between u and v doesn't exceed q_i.

Queries are numbered from 1 to m in the order of the input.

Examples

Input


7 5
1 2 1
3 2 3
2 4 1
4 5 2
5 7 4
3 6 2
5 2 3 4 1


Output


21 7 15 21 3 


Input


1 2
1 2


Output


0 0 


Input


3 3
1 2 1
2 3 2
1 3 2


Output


1 3 3 

Note

The picture shows the tree from the first example: <image>
from sys import stdin, stdout
MAX = 200003

# read input
n, m = map(int, raw_input().strip().split())
inp = stdin.readlines()

# wts[i] stores the vertex pairs with edge-weight i
wts = [[] for i in xrange(MAX)]

for i in xrange(n - 1):
    u, v, w = map(int, inp[i].strip().split())
    wts[w].append((u, v))

# read queries
q = map(int, inp[n - 1].strip().split())
# answering offline, so store the index along with the query
for i in xrange(m): q[i] = [q[i], i]
# then sort
q.sort()

# the output 
out = [0] * m

# DSU part
ans = 0
root = [i for i in xrange(n + 3)]
rank = [0 for i in xrange(n + 3)]
sz = [1 for i in xrange(n + 3)]
 
def find(x):
    global root
    y = x
    while root[x] != x:
        x = root[x]

    px = x
    x = y
    while root[x] != x:
        ox = x
        x = root[x]
        root[ox] = px

    return px
 
def union(x, y):
    global root, rank, ans
    x_root = find(x)
    y_root = find(y)

    if x_root == y_root: return

    a, b = sz[x_root], sz[y_root]
 
    if rank[x_root] > rank[y_root]:
        root[y_root] = x_root
        sz[x_root] += sz[y_root]
        sz[y_root] = 0
    else:
        root[x_root] = y_root
        if rank[x_root] == rank[y_root]: rank[y_root] += 1
        sz[y_root] += sz[x_root]
        sz[x_root] = 0

    sub = (a * (a - 1)) / 2 + (b * (b - 1)) / 2
    new = a + b
    add = (new * (new - 1)) / 2

    ans = (ans - sub + add)

# filling "out"
curwt = 1
for x, idx in q:
    for wt in xrange(curwt, x + 1):
        for u, v in wts[wt]: union(u, v)

    out[idx] = str(ans)
    curwt = x + 1

# print the final ans
stdout.write(" ".join(out))