//NiceDuck
#include "bits/stdc++.h"
typedef long long ll;
using namespace std;
#define FILE "000"
#define foru(i,a,b) for(int i=(int)(a); i<=(int)(b); ++i)
#define ford(i,a,b) for(int i=(int)(a); i>=(int)(b); --i)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);
#define pb push_back
#define fi first
#define se second
#define pii pair<int,int>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define MOD 1000000007
#define el "\n"

const int MAX=2e5+5;
int n,m;
pair<int,int> q[MAX];
ll ans[MAX];
vector<int> adj[MAX];
struct Edge 
{
    ll w; int u,v;
};
vector<Edge> edge;
bool cmp(const Edge &x, const Edge &y)
{
    return x.w<y.w;
}

int par[MAX],sz[MAX];
void buildDsu()
{
    foru(i,1,n)
    {
        par[i]=i;
        sz[i]=1;
    }
}
int find_par(int u)
{
    if(par[u]==u) return u;
    return par[u]=find_par(par[u]);
}
void join(int u, int v)
{
    u=find_par(u); v=find_par(v);
    if(u==v) return;
    if(sz[v]>sz[u]) swap(u,v);
    par[v]=u;
    sz[u]+=sz[v];
    return;
}

int main()
{
    fastio
    if(fopen(FILE ".inp","r"))
    {
       freopen(FILE ".inp","r",stdin);
       freopen(FILE ".out","w",stdout);
    }
    
    cin>>n>>m; 
    foru(i,1,n-1)
    {
        int u,v; ll w; cin>>u>>v>>w;
        edge.pb({w,u,v});
    }
    buildDsu();
    foru(i,1,m)
    {
        cin>>q[i].fi;
        q[i].se=i;
    }
    sort(q+1,q+m+1);
    if(edge.size()==0)
    {
        foru(i,1,m) cout<<"0 ";
        return 0;
    }
    sort(edge.begin(),edge.end(),cmp);
    int j=0;
    ll curAns=0;
    foru(i,1,m)
    {
        ans[q[i].se]=curAns;
        if(edge[j].w>q[i].fi) continue;
        else 
        {
            while(j<edge.size() && edge[j].w<=q[i].fi)
            {
                int u=edge[j].u, v=edge[j].v;
                ++j;
                u=find_par(u); v=find_par(v);
                if(u==v) continue;
                curAns+=(1LL*sz[u]*sz[v]);
                join(u,v);
            }
        }
        ans[q[i].se]=curAns;
    }
    foru(i,1,m) cout<<ans[i]<<' ';
    
    return 0;
}