RT
#include<bits/stdc++.h>
#define fr(n) for(int i=1;i<=n;i++)
using namespace std;
const int M=1e5+110;
//
int read(){
int sum=0,k=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') k=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
sum=sum*10+c-'0';
c=getchar();
}
return sum*k;
}
//
int fa[M];
int find(int x){
if(x==fa[x]) return fa[x];
return fa[x]=find(fa[x]);
}
//
struct w{
int next,to,w;
}e[M];
int head[M],k=0;
void add(int u,int v,int w){
k++;
e[k].next=head[u];
e[k].to=v;
e[k].w=w;
head[u]=k;
}
//
struct node{
int u,v,w,bian;
}ee[M];
bool cmp(node x,node y){
return x.w>y.w;
}
//
int n,m,w[M][26];
void jian(){
fr(n) fa[i]=i;
sort(ee+1,ee+1+m,cmp);
fr(m) if(find(ee[i].u)!=find(ee[i].v)){
fa[find(ee[i].u)]=find(ee[i].v);
add(ee[i].u,ee[i].v,ee[i].w);
add(ee[i].v,ee[i].u,ee[i].w);
}
}
//
int d[M],dp[M][26];
void dfs(int u,int fa,int ww){
d[u]=d[fa]+1;
dp[u][0]=fa;
w[u][0]=ww;
for(int i=1;(1<<i)<=d[u];i++) dp[u][i]=dp[dp[u][i-1]][i-1],w[u][i]=min(w[u][i-1],w[dp[u][i-1]][i-1]);
for(int i=head[u];i;i=e[i].next) if(e[i].to!=fa) dfs(e[i].to,u,e[i].w);
}
int LCA(int a,int b){
int ans=0x3f3f3f3f;
if(d[a]>d[b]) swap(a,b);
for(int i=20;i>=0;i--) if(d[b]-(1<<i)>=d[a]) b=dp[b][i],ans=min(ans,w[b][i]);
if(a==b) return ans;
for(int i=20;i>=0;i--) if(dp[a][i]!=dp[b][i]){
ans=min(ans,min(w[b][i],w[a][i]));
a=dp[a][i],b=dp[b][i];
}
return min(ans,min(w[b][0],w[a][0]));
}
//
int main(){
memset(w,0x3f3f3f3f,sizeof(w));
memset(fa,0x3f3f3f3f,sizeof(fa));
n=read(),m=read();
fr(m) ee[i].u=read(),ee[i].v=read(),ee[i].w=read();
jian();
fr(n) if(i==fa[i]) dfs(i,i,0x3f3f3f3f);
int q=read();
while(q--){
int x=read(),y=read();
if(find(x)!=find(y)){
cout<<-1<<endl;
continue;
}
cout<<LCA(x,y)<<endl;
}
return 0;
}
/*
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
*/
可能明天早上才能看到然后关注
谢谢dalao%%%