#include<iostream>
#include<vector>
#include<unordered_set>
#include<utility>
#include<cmath>
using namespace std;
typedef long long int ll;
ll root(ll a,ll *arr)
{
while(arr[a]>0)
a = arr[a];
return a;
}
void union1(ll r1,ll r2,ll *arr)
{
if(arr[r1]<arr[r2])
{
arr[r1]+=arr[r2];
arr[r2] = r1;
}
else
{
arr[r2]+=arr[r1];
arr[r1] = r2;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll n,q,i;
cin>>n>>q;
vector<vector<pair<ll,ll> > > vik(100001);
ll w,u,v;
for(i=1;i<n;i++)
{
cin>>u>>v>>w;
ll sq = sqrt(w);
for(ll j = 1;j<=sq;j++)
{
if(w%j==0)
{
if(w/j==j)
vik[j].push_back({u,v});
else
{
vik[j].push_back({u,v});
vik[w/j].push_back({u,v});
}
}
}
}
ll d;
ll arr[n+1];
for(i=1;i<=n;i++)
arr[i] = -1;
for(i=1;i<=q;i++)
{
cin>>d;
ll j;
unordered_set<ll> s;
unordered_set<ll>::iterator it;
for(j=0;j<vik[d].size();j++)
{
s.insert(vik[d][j].first);
s.insert(vik[d][j].second);
ll r1 = root(vik[d][j].first,arr),r2 = root(vik[d][j].second,arr);
union1(r1,r2,arr);
}
ll ans = 0;
while(s.size()>0)
{
it = s.begin();
if(arr[*it]<-1)
ans = ans + arr[*it]*(arr[*it]+1)/2;
arr[*it] = -1;
s.erase(it);
}
cout<<ans<<"\n";
}
}