#include <bits/stdc++.h>
using namespace std;

typedef long long int ll; 

vector<vector<ll>> dp;
ll n, d;

void dfs(ll node, ll parent, const vector<ll>& used, const vector<vector<ll>>& G, const vector<ll>& a) {
    ll sum_not_chosen = 0;
    ll sum_chosen = a[node];
   
    for (auto u : G[node]) {
        if (u != parent) {
            dfs(u, node, used, G, a);
            sum_not_chosen += max(dp[u][1], dp[u][0]);
            sum_chosen += max(dp[u][1] - 2 * d, dp[u][0]);
        }
    }
   
    dp[node][1] = sum_chosen; 	
    dp[node][0] = sum_not_chosen;	
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    ll t;
    if (cin >> t) {
        while (t--) {
            cin >> n >> d;
            
            vector<ll> a(n + 1, 0); 
            for (ll i = 1; i <= n; i++) {
                cin >> a[i];
            }

            vector<vector<ll>> G(n + 1); 
            for (ll i = 1; i <= n - 1; i++) {
                ll u, v;
                cin >> u >> v; 
                G[u].push_back(v);
                G[v].push_back(u); 
            }

            dp.assign(n + 5, vector<ll>(2, 0));
            vector<ll> used(n + 1, 0); 

            dfs(1, 0, used, G, a);
            
            cout << max(dp[1][1], dp[1][0]) << "\n";
        }
    }
    return 0;
}