样例过了,全WA了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 200005;
int fa[maxn][25],n,q,maxnum[maxn][25],m;
struct Node{
int x , y;
};
Node kth(int u , int k){
int val = 1000000;
for(int i = 20 ; i >= 0 ; i--) if(k & (1 << i)){
val = min(val,maxnum[u][i]);
u = fa[u][i];
}
Node ccd;
ccd.x = u;
ccd.y = val;
return ccd;
}
int dep[maxn];
int lca(int u , int v){
int cndfd = 1000005;
if(dep[u] < dep[v]) swap(u,v);
Node cfd = kth(u,dep[u] - dep[v]);
u = cfd.x;
cndfd = min(cndfd,cfd.y);
if(u == v) return cndfd;
for(int i = 20 ; i >= 0 ; i--){
if(fa[u][i] != fa[v][i]){
cndfd = min(maxnum[u][i],min(cndfd,maxnum[v][i]));
u = fa[u][i];
v = fa[v][i];
}
}
cndfd = min(cndfd , maxnum[u][0]);
cndfd = min(cndfd,maxnum[v][0]);
return cndfd;
}
vector<Node> g[maxn];
void dfs(Node u , int f){
// cout << u.x << " " << f << endl;
if(dep[u.x ] != 0) return ;
dep[u.x] = dep[f] + 1;
fa[u.x][0] = f;
maxnum[u.x][0] = u.y;
for(int i = 1 ; i <= 20 ; i++){
fa[u.x][i] = fa[fa[u.x][i - 1]][i - 1];
maxnum[u.x][i] = min(maxnum[u.x][i - 1],maxnum[fa[u.x][i - 1]][i - 1]);
}
for(auto v:g[u.x]){
if(v.x != f){
dfs(v,u.x);
}
}
}
signed main(){
cin >> n >> m;
for(int i = 1 ; i <= m ; i++){
int u , v , x;
scanf("%lld %lld %lld" , &u , &v , &x);
Node ccd;
ccd.x = v;
ccd.y = x;
g[u].push_back(ccd);
ccd.x = u;
g[v].push_back(ccd);
}
Node sd;
sd.x = 1;
sd.y = 0;
dfs(sd,0);
cin >> q;
int last = 0;
while(q--){
int u , v;
scanf("%lld %lld" , &u , &v);
int x = lca(u,v);
if(x == 0) x = -1;
cout << x << endl;
}
}