#include <bits/stdc++.h>
#define NAME "code"
#define ll long long
#define ull unsigned ll
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
using namespace std;
const int N= 1e5;
int n, m, k, q;
int g[N + 5];
vector<pii> adj[N + 5];
pii que[N + 5];
struct DSU {
int lab[N + 5];
void make_set() {
fill_n(lab + 1, n, -1);
}
int find_set(int u) {
if(lab[u] < 0) return u;
return lab[u]= find_set(lab[u]);
}
void union_set(int u, int v) {
u= find_set(u);
v= find_set(v);
if(u != v) {
if(lab[u] > lab[v]) swap(u, v);
lab[u] += lab[v], lab[v]= u;
}
}
bool check(int u, int v) {
return find_set(u) == find_set(v);
}
} dsu;
int dist[N + 5];
void prep() {
fill_n(dist + 1, n, 1e9);
priority_queue<pii> pq;
for(int i= 1; i <= k; ++i) {
dist[g[i]]= 0;
pq.push({0, g[i]});
}
while(pq.size()) {
auto [d, u]= pq.top(); pq.pop();
if(-d != dist[u]) continue;
for(auto [v, w] : adj[u])
if(dist[v] > dist[u] + w) {
dist[v]= dist[u] + w;
pq.push({-dist[v], v});
}
}
}
int num;
vector<int> val, have[N + 5];
void init() {
for(int i= 1; i <= n; ++i)
val.push_back(dist[i]);
sort(val.begin(), val.end());
num= unique(val.begin(), val.end()) - val.begin();
val.resize(num);
for(int i= 1; i <= n; ++i) {
int id= lower_bound(val.begin(), val.end(), dist[i]) - val.begin();
have[id].push_back(i);
}
}
int L[N + 5], R[N + 5];
int ans[N + 5];
bool act[N + 5];
vector<int> lis[N + 5];
void solve() {
cin >> n >> m;
for(int i= 1; i <= m; ++i) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
cin >> k;
for(int i= 1; i <= k; ++i)
cin >> g[i];
cin >> q;
for(int i= 1; i <= q; ++i) {
auto& [s, t]= que[i];
cin >> s >> t;
}
prep();
init();
for(int i= 1; i <= q; ++i) {
R[i]= num - 1;
lis[(num - 1) >> 1].push_back(i);
}
bool cond= 1;
while(cond) {
dsu.make_set();
fill_n(act + 1, n, 0);
for(int mid= num - 1; mid >= 0; --mid) {
for(int u : have[mid]) {
act[u]= 1;
for(auto [v, w] : adj[u])
if(act[v])
dsu.union_set(u, v);
}
for(int i : lis[mid]) {
auto [s, t]= que[i];
if(dsu.check(s, t)) ans[i]= mid, L[i]= mid + 1;
else R[i]= mid - 1;
}
lis[mid].clear();
}
cond= 0;
for(int i= 1; i <= q; ++i)
if(L[i] <= R[i]) {
lis[(L[i] + R[i]) >> 1].push_back(i);
cond= 1;
}
}
for(int i= 1; i <= q; ++i)
cout << val[ans[i]] << '\n';
}
signed main() {
if(fopen(NAME".inp", "r")) {
freopen(NAME".inp", "r", stdin);
freopen(NAME".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int tests= 1;
for(int i= 0; i < tests; ++i)
solve();
return 0;
}