这里是评测链接:Link
//Solar_Rain
//2024-07-19
//P1967 [NOIP2013 提高组] 货车运输
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+3,M=5e4+3;
int h[N],v[N*2],w[N*2],nt[N*2],newnod=1;
int f[N];
int n,m,q;
int d[N],fi[N][21],wi[N][21];
int ans;
void push(int u_in,int v_in,int w_in){
v[newnod]=v_in;
w[newnod]=w_in;
nt[newnod]=h[u_in];
h[u_in]=newnod++;
}
int findf(int x){
if(f[x]==x)return x;
return f[x]=findf(f[x]);
}
struct Nod{
int x,y;
int w;
}nod[M];
bool cmp(Nod a,Nod b){
return a.w>b.w;
}
int bk[N];
void dfs(int u,int fa,int weight){
bk[u]=1;
d[u]=d[fa]+1,fi[u][0]=fa,wi[u][0]=weight;
for(int i=1;i<=20;i++){
fi[u][i]=fi[fi[u][i-1]][i-1];
wi[u][i]=min(wi[u][i-1],wi[fi[u][i-1]][i-1]);
}
for(int i=h[u];i;i=nt[i]){
if(v[i]==fa)continue;
dfs(v[i],u,w[i]);
}
}
int lca(int a,int b){
int ans=1000000;
if(d[a]>d[b])swap(a,b);
for(int i=20;i>=0;i--)if(d[b]-(1<<i)>=d[a])ans=min(ans,wi[b][i]),b=fi[b][i];
if(a==b)return ans;
for(int i=20;i>=0;i--)
if(fi[a][i]!=fi[b][i]){
ans=min(ans,min(wi[a][i],wi[b][i]));
a=fi[a][i],b=fi[b][i];
}
ans=min(ans,wi[a][0]);
ans=min(ans,wi[b][0]);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1,x,y,z;i<=m;i++){
cin>>x>>y>>z;
nod[i].x=x;
nod[i].y=y;
nod[i].w=z;
}
sort(nod+1,nod+m,cmp);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
if(findf(nod[i].x)==findf(nod[i].y))continue;
push(nod[i].x,nod[i].y,nod[i].w);
push(nod[i].y,nod[i].x,nod[i].w);
f[findf(nod[i].x)]=findf(nod[i].y);//mrg
}
for(int i=1;i<=n;i++)
if(!bk[i])dfs(i,0,1000000);
cin>>q;
int x,y;
while(q--){
cin>>x>>y;
if(findf(x)!=findf(y)){
cout<<-1<<endl;
continue;
}
cout<<lca(x,y)<<endl;
}
return 0;
}