# haru: pypy import sys input = sys.stdin.readline II = lambda : int(input()) MI = lambda : map(int, input().split()) LI = lambda : [int(a) for a in input().split()] SI = lambda : input().rstrip() LLI = lambda n : [[int(a) for a in input().split()] for _ in range(n)] LSI = lambda n : [input().rstrip() for _ in range(n)] MI_1 = lambda : map(lambda x:int(x)-1, input().split()) LI_1 = lambda : [int(a)-1 for a in input().split()] mod = 998244353 inf = 1001001001001001001 ordalp = lambda s : ord(s)-65 if s.isupper() else ord(s)-97 ordallalp = lambda s : ord(s)-39 if s.isupper() else ord(s)-97 yes = lambda : print("Yes") no = lambda : print("No") yn = lambda flag : print("Yes" if flag else "No") prinf = lambda ans : print(ans if ans < 1000001001001001001 else -1) alplow = "abcdefghijklmnopqrstuvwxyz" alpup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" alpall = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" URDL = {'U':(-1,0), 'R':(0,1), 'D':(1,0), 'L':(0,-1)} DIR_4 = [[-1,0],[0,1],[1,0],[0,-1]] DIR_8 = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]] DIR_BISHOP = [[-1,1],[1,1],[1,-1],[-1,-1]] prime60 = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59] sys.set_int_max_str_digits(0) # sys.setrecursionlimit(10**6) # import pypyjit # pypyjit.set_param('max_unroll_recursion=-1') from collections import defaultdict,deque from heapq import heappop,heappush from bisect import bisect_left,bisect_right DD = defaultdict BSL = bisect_left BSR = bisect_right """ namori k <= x <= 2k を減らせる うーん、 """ n, k = MI() a = LI() d = [0] * n e = [[] for i in range(n)] for i in range(n): u, v = MI_1() e[u].append(v) e[v].append(u) d[u] += 1 d[v] += 1 que = [i for i in range(n) if d[i] == 1] ans = 0 for u in que: for v in e[u]: if d[v] > 0: p = v break a[p] -= a[u] if a[p] < 0: print(-1) exit() d[u] = 0 d[p] -= 1 if d[p] == 1: que.append(p) if 0 < a[u] < k: print(-1) exit() else: # たぶんあってる ans += ((a[u] - 1) // (2 * k)) + 1 # que に入っていない頂点が cycle for i in range(n): if d[i] > 0: u = i break # print(ans, a) s = u cyc = [] p = -1 while True: # print(u) cyc.append(u) for v in e[u]: if d[v] > 0 and v != p: nxt = v break if nxt == s: break p, u = u, nxt b = [a[u] for u in cyc] # print(ans, b) m = len(b) """ b[i] = x[i-1] + x[i] とする x[i] は d[i] + t : even d[i] - t : odd """ d = [0] * m for i in range(1, m): d[i] = b[i] - d[i - 1] sgn = [1, -1] if m % 2 == 1: # b[0] = 2 t + d[m - 1] t = b[0] - d[-1] if t % 2 == 1: print(-1) exit() t //= 2 d = [d[i] + (t * sgn[i & 1]) for i in range(m)] # これ回数 for i in range(m): if 0 < d[i] < k: print(-1) exit() else: ans += ((d[i] - 1) // (2 * k)) + 1 print(ans) else: if d[-1] != b[0]: print(-1) exit() # 最小化がひつようめう assert False