#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,s,n) for(int i=s;i<=n;i++)
#define vi vector<int>
#define pb push_back
#define pii pair<int,int>
#define eb emplace_back
#define fi first
#define se second
#define tup array<int, 3>
const int N = 1e5 + 5, L = 20;
vector<vector<pii>> adj(N), g(N);
int a,b,w;
vi pa(N), dep(N), dist(N, LLONG_MAX);
pii par[20][N];
int fpar(int u) {
if(pa[u] == u) return pa[u];
return pa[u] = fpar(pa[u]);
}
int lca(int u, int v) {
int res = LLONG_MAX;
if(dep[u] > dep[v]) swap(u, v);
int dif = dep[v] - dep[u];
for(int i=19;i>=0;i--) if(dif>>i & 1) {
res = min(res,par[i][v].se);
v=par[i][v].fi;
}
if(u==v) return res;
for(int i=19;i>=0;i--) {
if(par[i][u].fi != par[i][v].fi) {
u=par[i][u].fi; v=par[i][v].fi;
res=min({res,par[i][u].se,par[i][v].se});
} else if(par[i][u].fi!=0){
res=min({res,par[i][u].se,par[i][v].se});
}
}
return res;
}
void dfs(int u, int pp) {
par[0][u] = {pp, dist[u]};
for(pii p : g[u]) {
if(p.fi==pp) continue;
dep[p.fi] = dep[u] + 1;
dfs(p.fi, u);
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
rep(i,1,n) pa[i] = i;
vector<tup> ed;
rep(i,1,m) {
cin>>a>>b>>w;
ed.pb({w,a,b});
adj[a].eb(b,w);
adj[b].eb(a,w);
}
priority_queue<pii, vector<pii>, greater<pii>> pq;
int k; cin>>k;
rep(i,1,k) {
cin>>a;
dist[a]=0;
pq.push({0,a});
}
//compute min dist from x to all special cities
while(!pq.empty()) {
w = pq.top().fi;
a = pq.top().se;
pq.pop();
for(pii p1 : adj[a]) {
if(dist[p1.fi]>w+p1.se) {
dist[p1.fi] = w+p1.se;
pq.push({dist[p1.fi], p1.fi});
}
}
}
//maximum spanning tree
for(tup &t:ed) t[0] = min(dist[t[1]], dist[t[2]]);
sort(ed.begin(), ed.end(), greater<tup>());
for(tup t : ed) {
a=t[1]; b=t[2]; w=t[0];
if(fpar(a) != fpar(b)) {
g[a].eb(b,w);
g[b].eb(a,w);
pa[fpar(a)] = fpar(b);
}
}
//dfs tree rooted at 1
dep[1] = 1;
dfs(1, 0);
rep(i,1,19) rep(j,1,n) {
par[i][j].fi=par[i-1][par[i-1][j].fi].fi;
par[i][j].se = min(par[i-1][j].se,par[i-1][par[i-1][j].fi].se);
}
int q; cin>>q;
while(q--) {
cin>>a>>b;
cout << lca(a,b) << "\n";
}
return 0;
}