#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
using namespace std;
const int sz = 1e5 + 1, inf = 1e9 + 5;
int n, m, qs, k, cnt, in[sz], out[sz], d[sz], u[sz], v[sz], w[sz], p[sz], dp[18][sz], mn[18][sz];
vector<array<int, 2>> g[sz];
int par(int x)
{
    if(p[x] < 0) return x;
    return p[x] = par(p[x]);
}
bool join(int u, int v)
{
    u = par(u), v = par(v);
    if(u == v) return 0;
    if(p[u] > p[v]) swap(u, v);
    p[u] += p[v];
    p[v] = u;
    return 1;
}
void dfs(int v, int p)
{
    in[v] = ++cnt;
    for(auto i : g[v])
    {
        int u = i[0], w = i[1];
        if(u == p) continue;
        d[u] = d[v] + 1;
        dp[0][u] = v;
        mn[0][u] = w;
        dfs(u, v);
    }
    out[v] = cnt;
}
bool anc(int x, int y)
{
    return in[x] <= in[y] && out[y] <= out[x];
}
int lca(int u, int v)
{
    if(anc(u, v)) return u;
    if(anc(v, u)) return v;
    for(int i = 17; i >= 0; i--)
    {
        if(d[u] >= (1 << i) && !anc(dp[i][u], v)) u = dp[i][u];
    }
    return dp[0][u];
}
int get(int u, int v)
{
    int cm = lca(u, v);
    int du = d[u] - d[cm];
    int dv = d[v] - d[cm];
    int res = inf;
    for(int i = 0; i < 18; i++)
    {
        if((1 << i) & du)
        {
            res = min(res, mn[i][u]);
            u = dp[i][u];
        }
    }
    for(int i = 0; i < 18; i++)
    {
        if((1 << i) & dv)
        {
            res = min(res, mn[i][v]);
            v = dp[i][v];
        }
    }
    return res;
}
void solve()
{
    in[0] = inf;
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> u[i] >> v[i] >> w[i];
        g[u[i]].push_back({v[i], w[i]});
        g[v[i]].push_back({u[i], w[i]});
    }
    priority_queue<array<int, 2>, vector<array<int, 2>>, greater<array<int, 2>>> q;
    fill(d + 1, d + 1 + n, inf);
    cin >> k;
    for(int i = 1; i <= k; i++)
    {
        int npp;
        cin >> npp;
        q.push({0, npp});
        d[npp] = 0;
    }
    while(!q.empty())
    {
        int v = q.top()[1], dist = q.top()[0];
        q.pop();
        if(dist > d[v]) continue;
        for(auto i : g[v])
        {
            int u = i[0], w = i[1];
            if(d[u] > d[v] + w)
            {
                d[u] = d[v] + w;
                q.push({d[u], u});
            }
        }
    }
    vector<array<int, 3>> e;
    for(int i = 1; i <= m; i++)
    {
        w[i] = min(d[u[i]], d[v[i]]);
        e.push_back({w[i], u[i], v[i]});
    }
    sort(all(e), greater<array<int, 3>>());
    fill(p + 1, p + 1 + n, -1);
    for(int i = 1; i <= n; i++) g[i].clear(), d[i] = 0;
    for(auto ex : e)
    {
        if(join(ex[1], ex[2]))
        {
            g[ex[1]].push_back({ex[2], ex[0]});
            g[ex[2]].push_back({ex[1], ex[0]});
        }
    }
    e.clear();
    for(int i = 0; i < 18; i++) for(int j = 1; j <= n; j++) mn[i][j] = inf;
    dfs(1, 0);
    for(int i = 1; i < 18; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(d[j] >= (1 << i)) 
            {
                dp[i][j] = dp[i - 1][dp[i - 1][j]];
                mn[i][j] = min(mn[i - 1][j], mn[i - 1][dp[i - 1][j]]);
            }
        }
    }
    cin >> qs;
    while(qs--)
    {
        int s, t;
        cin >> s >> t;
        cout << get(s, t) << '\n';
    }
}
signed main()
{                                                                  
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int t = 1;
    // cin >> t;
    while(t--) solve();
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |