#include<bits/stdc++.h>
#define int long long
using namespace std;
int vis[1000005],q,n,m,cnt,p,h2[1000005],s,lg[500005],d[500005],f[500005][20],h[1000001],mn[500005][20];
struct node
{
int u,v,w;
} aaa[1000500];
bool cmpp(node a,node b)
{
return a.w>b.w;
}
int fff[1000505];
int find(int x)
{
if(x==fff[x])
return x;
return fff[x]=find(fff[x]);
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
fff[fy]=fx;
}
struct pj
{
int v,w;
int nxt;
} e[1000001];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void dfs(int x,int fa,int w)
{
vis[x]=1;
int v,u;
f[x][0]=fa;
mn[x][0]=w;
d[x]=d[fa]+1;
for(int i=1; i<=lg[d[x]]; i++)
{
f[x][i]=f[f[x][i-1]][i-1];
mn[x][i]=min(mn[x][i],min(mn[x][i-1],mn[f[x][i-1]][i-1]));
}
for(int i=h[x]; i; i=e[i].nxt)
{
v=e[i].v;
if(v!=fa)
dfs(v,x,e[i].w);
}
}
int LCA(int x,int y)
{
if(find(x)!=find(y))return -1;
if(d[x]<d[y])swap(x,y);
int ans=1e17;
while(d[x]>d[y])
{
ans=min(ans,mn[x][lg[d[x]-d[y]]]);
x=f[x][lg[d[x]-d[y]]];
}
if(x==y)return ans;
for(int k=lg[d[x]]; k>=0; --k)
if(f[x][k]!=f[y][k])
{
ans=min(ans,min(mn[x][k],mn[y][k]));
x=f[x][k],y=f[y][k];
}
ans=min(ans,min(mn[x][0],mn[y][0]));
return ans;
}
signed main()
{
memset(mn,0x3f,sizeof(mn));
cin>>n>>m;
for(int i=1; i<=m; i++)
{
cin>>aaa[i].u>>aaa[i].v>>aaa[i].w;
}
sort(aaa+1,aaa+m,cmpp);
for(int i=1; i<=n; i++)fff[i]=i;
for(int i=1; i<=m; i++)
{
int fx=find(aaa[i].u),fy=find(aaa[i].v),w=aaa[i].w;
if(fx!=fy)
{
merge(fx,fy);
add(aaa[i].u,aaa[i].v,w);
add(aaa[i].v,aaa[i].u,w);
}
}
lg[1]=0;
for(int i=2; i<=n; i++)
lg[i]=lg[i/2]+1;
for(int i=1; i<=n; i++)
{
if(vis[i]==0)
dfs(i,i,1e17);
}
cin>>q;
for(int i=1; i<=q; i++)
{
int a,b;
cin>>a>>b;
cout<<LCA(a,b)<<"\n";
}
return 0;
}
就错一个点!!!!!