#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll fa[10010],cnt,deep[10010],dis[100010][25],jump[10010][25];
struct six{
ll T;
ll N;
ll H;
ll W;
}tree[50010];
struct sex{
ll t;
ll h;
ll w;
}tr[50010];
bool cmp(sex f,sex s)
{
return f.w>s.w;
}
ll found(ll x)
{
if(fa[x]==x)
{
return x;
}
fa[x]=found(fa[x]);
return fa[x];
}
void build(ll x,ll y,ll z)
{
tree[++cnt].N=tree[x].H;
tree[cnt].T=y;
tree[cnt].W=z;
tree[x].H=cnt;
}
void DFS(ll x)
{
for(ll i=tree[x].H;i!=-1;i=tree[i].N)
{
ll t=tree[i].T;
if(deep[t]!=0)
{
continue;
}
deep[t]=deep[x]+1;
dis[t][0]=min(dis[t][0],tree[i].W);
jump[t][0]=x;
DFS(t);
}
}
ll LCA(ll x,ll y)
{
if(found(x)!=found(y))
{
return -1;
}
if(deep[x]<deep[y])
{
swap(x,y);
}
ll ans=456789456789;
for(ll i=20;i>=0;i--)
{
if(deep[jump[x][i]]>deep[y])
{
ans=min(ans,dis[x][i]);
x=jump[x][i];
}
}
if(x==y)
{
return ans;
}
for(ll i=20;i>=0;i--)
{
if(jump[y][i]!=jump[x][i])
{
ans=min(ans,dis[y][i]);
ans=min(ans,dis[x][i]);
x=jump[x][i];
y=jump[y][i];
}
}
return min(ans,min(dis[x][0],dis[y][0]));
}
int main()
{
// freopen("P1967_3.in","r",stdin);
// freopen("answer.out","w",stdout);
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
fa[i]=i;
}
for(ll i=1;i<=m;i++)
{
ll x,y,z;
cin>>x>>y>>z;
tr[i].h=x;
tr[i].t=y;
tr[i].w=z;
}
for(ll i=1;i<=50010;i++)
{
tree[i].H=-1;
}
sort(tr+1,tr+1+m,cmp);
for(ll i=1;i<=m;i++)
{
ll x=found(tr[i].h);
ll y=found(tr[i].t);
if(x!=y)
{
fa[x]=y;
build(tr[i].h,tr[i].t,tr[i].w);
build(tr[i].t,tr[i].h,tr[i].w);
}
}
memset(dis,0x3f3f3f3f,sizeof(dis));
for(ll i=1;i<=n;i++)
{
if(deep[i]==0)
{
deep[i]=1;
DFS(i);
jump[i][0]=i;
dis[i][0]=0x3f3f3f3f;
}
}
for(ll i=1;i<=20;i++)
{
for(ll j=1;j<=n;j++)
{
jump[j][i]=jump[jump[j][i-1]][i-1];
dis[j][i]=min(dis[j][i-1],dis[jump[j][i-1]][i-1]);
}
}
ll q;
cin>>q;
while(q--)
{
ll x,y;
cin>>x>>y;
cout<<LCA(x,y)<<endl;
}
}
谢谢