#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z;
struct code{
int u,v,num;
}asd[1000000];
struct node{
int to,num;
};
int f[10001];
int lca[10001][40];
int ans[10001][40];
bool cmp(code A,code B){
return A.num>B.num;
}
vector<node>q[10001];
int F(int GF){
if(f[GF]==GF)return GF;
return f[GF]=F(f[GF]);
}
bool opi[100001];
int sid[100001];
void awe(int number){
opi[number]=1;
for(int i=1;i<=35;i++){
lca[number][i]=lca[lca[number][i-1]][i-1];
ans[number][i]=min(ans[number][i-1],ans[lca[number][i-1]][i-1]);
}
for(node i:q[number]){
if(opi[i.to]==0){
awe(i.to);
sid[i.to]=sid[number]+1;
lca[i.to][0]=number;
ans[i.to][0]=i.num;
}
}
return;
}
int Q,A,B;
int main(){
cin>>n>>m;
memset(ans,20,sizeof(ans));
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
asd[i]=code{x,y,z};
}
for(int i=1;i<=n;i++)f[i]=i;
sort(asd+1,asd+m+1,cmp);
for(int i=1;i<=m;i++){
if(F(asd[i].u)!=F(asd[i].v)){
f[F(asd[i].u)]=F(asd[i].v);
q[asd[i].u].push_back(node{asd[i].v,asd[i].num});
q[asd[i].v].push_back(node{asd[i].u,asd[i].num});
}
}
sid[1]=1;
awe(1);
cin>>Q;
sid[0]=9999999999;
for(int i=1;i<=Q;i++){
int ans_=9999999999;
cin>>A>>B;
if(F(A)!=F(B)){
cout<<-1<<endl;
continue;
}
if(sid[A]<sid[B])swap(A,B);
for(int o=0;o<=30;o++){
if(sid[lca[A][o]]<=sid[B]){
ans_=min(ans[A][o],ans_);
A=lca[A][o];
}
}
for(int o=30;o>=0;o--){
if(lca[A][o]!=lca[B][o]){
ans_=min(ans_,min(ans[A][o],ans[B][o]));
A=lca[A][o];
B=lca[B][o];
}
}
if(A!=B){
ans_=min(ans_,min(ans[B][0],ans[A][0]));
A=lca[A][0];
B=lca[B][0];
}
cout<<ans_<<endl;
}
return 0;
}