OI XXVI - kol

// https://szkopul.edu.pl/problemset/problem/CACYTyPO4YJxyZzNumr0zr5e/site/?key=statement

// Kolacje

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 100 * 1001, sizik2 = 18;

#define ar std::array
#define pr std::pair
#define vec std::vector

// #define GARY_DBG

typedef std::map<int, vec<ar<int, 2>>> _kra;
typedef std::pair<int, int> Qtype;

int timer, pre[sizik], post[sizik];

struct PreComparator {
    bool operator()(int a, int b) const { return pre[a] < pre[b]; }
};

typedef std::vector<std::set<int, PreComparator>> VS_type;

int n, r;

int visited[sizik], visited_cnt = 1;

std::bitset<sizik> wasThisBadboy;
int kolor[sizik];
_kra kra_main;

int d[sizik];

struct _cmp {
    bool operator()(const Qtype& a, const Qtype& b) const { return a > b; }
};

void Dijkstra(_kra& kra, int type, VS_type& VS) {
    visited_cnt++;

    std::priority_queue<Qtype, vec<Qtype>, _cmp> q;
    for (const auto& a : VS[type]) {
        if (kolor[a] == type) {
            q.push({0, a});
            d[a] = 0;
        }
    }

    while (!q.empty()) {
        const auto [dist, u] = q.top();
        q.pop();

        if (visited[u] == visited_cnt) continue;

        d[u] = dist;
        visited[u] = visited_cnt;

        for (const auto& [v, w] : kra[u]) {
            q.push({w + dist, v});
        }
    }
}

int jump[sizik][sizik2];
int jump1[sizik][sizik2];
int mini_d[sizik][sizik2];

int depth[sizik];
int depth1[sizik];

int dist_from_root[sizik];

void DFS_first(int v, int p, int op_dist, _kra& kra) {
    pre[v] = ++timer;

    depth[v] = depth[p] + 1;

    dist_from_root[v] = op_dist;

    jump[v][0] = p;
    for (int i = 1; i < sizik2; i++) {
        jump[v][i] = jump[jump[v][i - 1]][i - 1];
    }

    for (const auto& [u, w] : kra[v]) {
        if (u == p) continue;
        DFS_first(u, v, op_dist + w, kra);
    }

    post[v] = ++timer;
}

void DFSvi(int v, int p, _kra& kra) {
    depth1[v] = depth1[p] + 1;

    jump1[v][0] = p;
    for (int i = 1; i < sizik2; i++) {
        jump1[v][i] = jump1[jump1[v][i - 1]][i - 1];
    }

    mini_d[v][0] = d[v];
    for (int i = 1; i < sizik2; i++) {
        mini_d[v][i] = std::min(mini_d[v][i - 1], mini_d[jump1[v][i - 1]][i - 1]);
    }

    for (const auto& [u, w] : kra[v]) {
        if (u == p) continue;
        DFSvi(u, v, kra);
    }
}

bool is_ancestor(int u, int v) {
    return pre[u] <= pre[v] && post[u] >= post[v];
}

int lca(int u, int v) {
    if (is_ancestor(u, v)) return u;
    if (is_ancestor(v, u)) return v;
    for (int i = sizik2 - 1; i >= 0; --i) {
        if (!is_ancestor(jump[u][i], v)) u = jump[u][i];
    }
    return jump[u][0];
}

int get_mini(int u, int v) {
    int res = INT64_MAX;

    auto lift = [&](int& x, int steps) {
        for (int i = sizik2 - 1; i >= 0; --i) {
            if ((1 << i) <= steps) {
                if (mini_d[x][i] == 0) {
                    res = 0;
                    return;
                }
                res = std::min(res, mini_d[x][i]);
                x = jump1[x][i];
                steps -= (1 << i);
            }
        }
    };

    int l = lca(u, v);

    if (d[u] == 0 || d[v] == 0 || d[l] == 0) return 0;

    lift(u, depth1[u] - depth1[l]);
    if (res == 0) return 0;
    lift(v, depth1[v] - depth1[l]);
    if (res == 0) return 0;

    res = std::min(res, d[l]);
    return res;
}

int distance_o(int u, int v) {
    int l = lca(u, v);
    return dist_from_root[u] + dist_from_root[v] - 2 * dist_from_root[l];
}

std::vector<ar<int, 3>> zapytania_do_rozwazenia[sizik];
int final_ans[sizik];

void solve_spb(int local_color, VS_type& VS) {
    if (!wasThisBadboy[local_color]) {
        for (const auto& [i, a, b] : zapytania_do_rozwazenia[local_color]) {
            final_ans[i] = INT64_MAX;
        }
        return;
    }

    std::vector<int> was;
    for (const auto& a : VS[local_color]) {
        was.push_back(a);
    }
    int nk = (int)was.size();

    std::sort(was.begin(), was.end(), PreComparator());

    for (int i = 0; i < nk - 1; i++) {
        VS[local_color].insert(lca(was[i], was[i + 1]));
    }
    _kra local_kra;

    was.clear();
    for (const auto& a : VS[local_color]) {
        was.push_back(a);

        depth1[a] = 0;
        d[a] = INT64_MAX;
        for (int j = 0; j < sizik2; j++) {
            jump1[a][j] = 0;
            mini_d[a][j] = 0;
        }
    }

    std::sort(was.begin(), was.end(), PreComparator());

    nk = (int)was.size();
    for (int i = 0; i < nk - 1; i++) {
        // (u,v) ~> (lca(u,v),v)
        int u = lca(was[i], was[i + 1]);
        int v = was[i + 1];

        int local_dist = distance_o(u, v);
        local_kra[u].push_back({v, local_dist});
        local_kra[v].push_back({u, local_dist});
    }

    Dijkstra(local_kra, local_color, VS);
    DFSvi(was[0], was[0], local_kra);

    for (const auto& [i, a, b] : zapytania_do_rozwazenia[local_color]) {
        int ans_for_this = 2 * get_mini(a, b) + distance_o(a, b);
        final_ans[i] = ans_for_this;
    }
}

void solve() {
    std::cin >> n >> r;

    VS_type VS(r + 2);

    for (int i = 1; i <= n; i++) {
        std::cin >> kolor[i];
        wasThisBadboy[kolor[i]] = 1;
    }

    for (int i = 0; i < n - 1; i++) {
        // [v, u, cost]
        int a, b, c;
        std::cin >> a >> b >> c;

        kra_main[a].push_back({b, c});
        kra_main[b].push_back({a, c});
    }

    for (int i = 1; i <= n; i++) {
        std::sort(kra_main[i].begin(), kra_main[i].end());
    }

    DFS_first(1, 1, 0, kra_main);

    for (int i = 1; i <= n; i++) {
        VS[kolor[i]].insert(i);
    }

    int q;
    std::cin >> q;

    for (int i = 1; i <= q; i++) {
        int a, b, c;
        std::cin >> a >> b >> c;
        zapytania_do_rozwazenia[c].push_back({i, a, b});
        VS[c].insert(a);
        VS[c].insert(b);
    }

    for (int i = 1; i <= r; i++) {
        solve_spb(i, VS);
    }

    for (int i = 1; i <= q; i++) {
        if (final_ans[i] == INT64_MAX) {
            std::cout << "-1\n";
        } else {
            std::cout << final_ans[i] << '\n';
        }
    }
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}