#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define all(s) s.begin(),s.end()
#define sz(s) (int)s.size()
using namespace std;
using ll = long long;
using ii = pair<int,int>;
using aa = array<int,3>;
const int N = 1e5+5;
const int base = 100;
const int INF = 1e18;
const int MOD = 1e9+7;
int n, m, q, u, v, c, k, kc;
int d[N], s[N], t[N], p[N], num[N], depth[N];
ii up[N][20];
vector <ii> edge;
vector <aa> edges;
vector <ii> adj[N], g[N];
priority_queue<ii,vector<ii>,greater<ii>> pq;
void dijkstra(){
while (!pq.empty()){
tie(kc,u) = pq.top();
pq.pop();
if (kc > d[u]) continue;
for (ii it : adj[u]){
if (d[it.fi] > d[u] + it.se){
d[it.fi] = d[u] + it.se;
pq.push({d[it.fi],it.fi});
}
}
}
}
int get(int u){
return (p[u] == u ? u : p[u] = get(p[u]));
}
bool dsu(int u,int v){
u = get(u);
v = get(v);
if (u == v) return 0;
if (num[u] < num[v]) swap(u,v);
num[u] += num[v];
p[v] = u;
return 1;
}
void dfs(int u,int p){
up[u][0].fi = p;
depth[u] = depth[p] + 1;
for (ii it : g[u]){
if (it.fi == p) continue;
up[it.fi][0].se = it.se;
dfs(it.fi,u);
}
}
void prepareLCA(){
for (int j = 1; j <= 19; j++) up[0][j] = {0,INF};
for (int j = 1; j <= 19; j++){
for (int i = 1; i <= n; i++){
up[i][j].fi = up[up[i][j - 1].fi][j - 1].fi;
up[i][j].se = min(up[i][j - 1].se,up[up[i][j - 1].fi][j - 1].se);
}
}
}
int LCA(int u,int v){
int res = INF;
if (depth[u] != depth[v]){
if (depth[u] < depth[v]) swap(u,v);
int height = depth[u] - depth[v];
for (int j = 0; j <= 19; j++){
if (height >> j & 1){
res = min(res,up[u][j].se);
u = up[u][j].fi;
}
}
}
if (u == v) return res;
int k = __lg(depth[u]);
for (int j = 19; j >= 0; j--){
if (up[u][j].fi != up[v][j].fi){
res = min({res,up[u][j].se,up[v][j].se});
u = up[u][j].fi;
v = up[v][j].fi;
}
}
res = min({res,up[u][0].se,up[v][0].se});
return res;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
#define name "EXIT"
if (fopen(name".inp","r")){
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> u >> v >> c;
adj[u].push_back({v,c});
adj[v].push_back({u,c});
edge.push_back({u,v});
}
cin >> k;
for (int i = 1; i <= n; i++){
d[i] = INF;
num[i] = 1;
p[i] = i;
}
for (int i = 1; i <= k; i++){
cin >> u;
pq.push({0,u});
d[u] = 0;
}
dijkstra();
for (int i = 1; i <= m; i++){
tie(u,v) = edge[i - 1];
edges.push_back({min(d[u],d[v]),u,v});
}
sort(all(edges),greater<aa>());
for (aa it : edges){
c = it[0];
u = it[1];
v = it[2];
if (dsu(u,v)){
g[u].push_back({v,c});
g[v].push_back({u,c});
}
}
dfs(1,0);
prepareLCA();
cin >> q;
for (int i = 1; i <= q; i++){
cin >> u >> v;
cout << LCA(u,v) << '\n';
}
return 0;
}