#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
const ll MAXN=2e6+5,MOD=1e9+7,INF=1e9,LG=16,MAX=1e9,base=31;
ll i,n,m,j,k,p,t,a[MAXN],par[MAXN],sz[MAXN],l[MAXN],r[MAXN],best[MAXN],dist[MAXN];
struct h{
ll u,v,c;
} edge[MAXN];
struct mt{
ll u,v;
} q[MAXN];
vector<pair<ll,ll>> adj[MAXN];
vector<ll> luu[MAXN];
priority_queue<pair<ll,ll>> pq;
void dij(){
while(pq.size()){
auto k=pq.top();pq.pop();
if(-k.fi>dist[k.se]){
continue;
}
for(auto x:adj[k.se]){
if(dist[x.fi]>-k.fi+x.se){
dist[x.fi]=-k.fi+x.se;
pq.push({-dist[x.fi],x.fi});
}
}
}
}
ll find(ll v){
return (par[v]==v?v:par[v]=find(par[v]));
}
void union_set(ll u,ll v){
u=find(u),v=find(v);
if(u==v) return;
if(sz[u]<sz[v]) swap(u,v);
par[v]=u;
sz[u]+=sz[v];
}
bool cmp(h x,h y){
return x.c>y.c;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("CGAME.inp","r",stdin);
// freopen("CGAME.out","w",stdout);
cin>>n>>m;
for(i=1;i<=n;i++)
dist[i]=INF;
for(i=1;i<=m;i++){
ll u,v,c;
cin>>u>>v>>c;
edge[i]={u,v,c};
adj[u].pb({v,c});
adj[v].pb({u,c});
}
cin>>k;
for(i=1;i<=k;i++){
cin>>p;
dist[p]=0;
pq.push({0,p});
}
dij();
for(i=1;i<=m;i++){
edge[i].c=min(dist[edge[i].u],dist[edge[i].v]);
}
sort(edge+1,edge+m+1,cmp);
cin>>k;
vector<ll> b;
for(i=1;i<=k;i++){
cin>>q[i].u>>q[i].v;
l[i]=1;
r[i]=m;
best[i]=0;
b.pb(i);
}
while(b.size()){
for(i=1;i<=n;i++)
par[i]=i,sz[i]=1;
vector<ll> c;
for(ll x:b){
if(l[x]>r[x]) continue;
c.pb(x);
luu[(l[x]+r[x])>>1].pb(x);
}
for(i=1;i<=m;i++){
union_set(edge[i].u,edge[i].v);
for(ll x:luu[i]){
if(find(q[x].u)==find(q[x].v)){
best[x]=edge[i].c;
r[x]=i-1;
}
else l[x]=i+1;
}
luu[i].clear();
}
swap(b,c);
}
for(i=1;i<=k;i++)
cout<<best[i]<<'\n';
return 0;
}