#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define fi first
#define se second
#define pb push_back
#define ii pair<int , int>
#define pq priority_queue
#define iii pair<int , pair<int , int>>
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define fod(i,r,l) for(int i=r;i>=l;i--)
#define fill(f,x) memset(f,x,sizeof(f))
#define NAME "file"

const int N = 2e5 + 5, mod = 1e9 + 7;
int s[N] , hev[N] , d[N] , head[N] , pos[N] , cnt = 0 , par[N] , node[N];
int st[4*N] , a[N] , bit[N] , sum = 0;
int n , q; 
vector <int> g[N];

void dfs(int u , int pa)
{
    s[u] = 1;
    for (auto v : g[u])
    if (v != pa)
    {
        d[v] = d[u] + 1;
        par[v] = u;

        dfs(v , u);

        s[u] += s[v];
        if (s[v] > s[hev[u]])
            hev[u] = v;
    }
}

void hld(int u , int pa , int h)
{
    head[u] = h;
    pos[u] = ++cnt;
    node[cnt] = u;

    if (hev[u] != 0)
        hld(hev[u] , u , h);

    for (auto v : g[u])
    if (v != pa && v != hev[u])
        hld(v , u , v);
}

void upd_st(int i, int val, int id = 1, int l = 1, int r = n) 
{
    if (l > i || r < i)
        return;
 
    if (l == r) 
    {
        st[id] = val;
        return;
    }
 
    int mid = (l + r) >> 1; 
    upd_st(i, val, id * 2, l, mid);
    upd_st(i, val, id * 2 + 1, mid + 1, r);
    st[id] = max(st[2 * id] , st[2 * id + 1]);
}
 
int get_st(int u, int v, int id = 1, int l = 1, int r = n)
{
    if (r < u || v < l) return 0;
    if (u <= l && r <= v) return st[id];
 
    int mid = (l + r) >> 1;
    return max(get_st(u, v, id * 2, l, mid) , get_st(u, v, id * 2 + 1, mid + 1, r));
}

void upd_cnt(int x, int v) 
{
    x++;
	for (; x <= 200001; x += x & -x) bit[x] += v;
}
int get_cnt(int x) 
{
    x++;
	int res = 0;
	for (; x >= 1; x &= x - 1) res += bit[x];
	return res;
}

void walk(int u, int v, int w, int id = 1, int l = 1, int r = n)
{
    if (st[id] < w || r < u || v < l) return;
    
    if (l == r)
    {
        int i = node[l]; //i la dinh cos pos[i] == l
        upd_cnt(a[i] , -1);
        sum -= a[i];

        a[i] %= w;
        st[id] = a[i];

        sum += a[i];
        upd_cnt(a[i] , 1);
    }
    else
    {
        int mid = (l + r) / 2;
        walk(u, v, w, id * 2, l, mid);
        walk(u, v, w, id * 2 + 1, mid + 1, r);

        st[id] = max(st[id * 2] , st[id * 2 + 1]);
    }
}

void lca(int u , int v , int w)
{
    while (head[u] != head[v])
    {
        if (d[head[u]] < d[head[v]])
            swap(u , v);

        walk(pos[head[u]] , pos[u] , w);
        u = par[head[u]];
    }
    if (d[u] < d[v])
        swap(u , v);
    walk(pos[v] , pos[u] , w);
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);  cout.tie(0);
    //freopen(NAME".INP" , "r" , stdin);
    //freopen(NAME".OUT" , "w" , stdout);

    cin >> n >> q;
    fo(i, 1, n) cin >> a[i];
    fo(i, 1, n - 1)
    {
        int u , v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    d[1] = 1;
    dfs(1 , 0);
    hld(1 , 0 , 1);

    fo(i, 1, n)
    {
        upd_st(pos[i] , a[i]);
        upd_cnt(a[i] , 1);
        sum += a[i];
    }

    fo(t, 1, q)
    {
        int x , y , w;
        cin >> x >> y >> w;
        lca(x , y , w);

        int res = sum , db = 0;
        fo(k, 1, 200000 / t)
        {
            res -= (get_cnt(min((k + 1) * t - 1 , 200000LL)) - get_cnt(k * t - 1)) * k * t;
        }
        cout << res << '\n';
    }
}
// haronnee_