//LongvnXD
#include <bits/stdc++.h>
#define ll long long
#define pll pair<ll, ll>
#define ii pair<int, int>
#define fi first
#define se second
#define x first
#define y second
#define all(v) v.begin(), v.end()
const int N = 2e5 + 5;
const int oo = 1e9 + 9;
using namespace std;
int n, m, k, q, d[N];
vector<ii> g[N];
namespace task1234 {
int par[20][N], Min[20][N], de[N];
void dfs(int u,int p) {
de[u] = de[p] + 1;
par[0][u] = p;
Min[0][u] = d[u];
for(int i = 1; i < 20; ++i) {
par[i][u] = par[i - 1][par[i - 1][u]];
Min[i][u] = min(Min[i - 1][u], Min[i - 1][par[i - 1][u]]);
}
for(ii& temp : g[u]) {
int v = temp.fi;
if(v != p)
dfs(v, u);
}
}
int get(int u,int v) {
int ok = oo;
if(de[u] < de[v]) swap(u, v);
for(int i = 19; i >= 0; --i) {
if(de[u] - (1 << i) >= de[v]) {
ok = min(ok, Min[i][u]);
u = par[i][u];
}
}
if(u == v) return min(ok, Min[0][u]);
for(int i = 19; i >= 0; --i) {
if(par[i][u] != par[i][v]) {
ok = min({ok, Min[i][u], Min[i][v]});
u = par[i][u];
v = par[i][v];
}
}
return min({ok, Min[1][u], Min[1][v]});
}
void solve() {
for(int i = 0; i < 20; ++i) for(int j = 1; j <= n; ++j) Min[i][j] = oo;
dfs(1, 0);
cin >> q;
int u, v;
while(q--) {
cin >> u >> v;
cout << get(u, v) << '\n';
}
}
}
namespace task5 {
int b[N];
bool check(int s,int t,int x) {
for(int i = 1; i <= n; ++i) b[i] = 0;
queue<int> q;
q.push(s);
b[s] = 1;
while(q.size()) {
int u = q.front(); q.pop();
for(ii& temp2 : g[u]) {
int v = temp2.fi;
if(d[v] >= x && !b[v])
q.push(v), b[v] = 1;
}
}
return b[t];
}
void solve() {
cin >> q;
int u, v;
while(q--) {
cin >> u >> v;
int l = 0, r = min(d[u], d[v]), mid;
while(l <= r) {
mid = l + r >> 1;
if(check(u, v, mid))
l = mid + 1;
else
r = mid - 1;
}
cout << l - 1 << '\n';
}
}
}
void solve() {
if(m == n - 1) task1234::solve();
else task5::solve();
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
for(int i = 1, u, v, w; i <= m; ++i) {
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
cin >> k;
for(int i = 1; i <= n; ++i) d[i] = oo;
priority_queue<ii, vector<ii>, greater<ii>> q;
for(int i = 1, x; i <= k; ++i) {
cin >> x;
d[x] = 0;
q.push({0, x});
}
while(q.size()) {
ii temp = q.top(); q.pop();
int x = temp.fi;
int u = temp.se;
if(d[u] != x) continue;
for(ii& temp2 : g[u]) {
int v = temp2.fi, w = temp2.se;
if(d[v] > x + w) {
d[v] = x + w;
q.push({x + w, v});
}
}
}
solve();
return 0;
}