#include<iostream>
#include<tuple>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=5e5+10;
int n,m,dep[N],fa[N],q,l,r,tx;
using t3i=tuple<int,int,int>;
t3i edge[N];
vector<pair<int,int>> road[N];
int mn[N][30],ft[N][30];
void dfs(int nod,int pr){
mn[nod][0]=pr;
for(int i=1;i<=20;i++){
ft[nod][i]=ft[ft[nod][i-1]][i-1];
mn[nod][i]=min(mn[nod][i-1],mn[ft[nod][i-1]][i-1]);
}
for(auto& [i,v]:road[nod]){
if(dep[i])continue;
dep[i]=dep[nod]+1;
ft[i][0]=nod;
dfs(i,v);
}
}
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
inline void merge(int x,int y){
fa[find(y)]=find(x);
}
inline void adv(int& x,int v){
for(int i=0;v;i++){
if(v&1)x=ft[x][i];
v>>=1;
}
}
inline int lca(int x,int y){
if(dep[x]>dep[y])x^=y^=x^=y;
adv(y,dep[y]-dep[x]);
for(int i=20;i>=0;i--){
if(ft[x][i]!=ft[y][i]){
x=ft[x][i],y=ft[y][i];
}
}
return ft[x][0];
}
inline int fd_mn(int x,int v){
int res=0x3f3f3f3f;
for(int i=0;v;i++){
if(v&1)res=min(res,mn[x][i]),x=ft[x][i];
v>>=1;
}
return res;
}
int main(){
memset(mn,0x3f,sizeof mn);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
auto& [z,x,y]=edge[i];
scanf("%d%d%d",&x,&y,&z);
}
sort(edge+1,edge+m+1);
for(int i=m;i;i--){
auto& [z,x,y]=edge[i];
if(find(x)==find(y))continue;
merge(x,y);
road[x].push_back({y,z}),
road[y].push_back({x,z});
}
for(int i=1;i<=n;i++){
if(!dep[i])dep[i]=1,dfs(i,0x3f3f3f3f);
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d",&l,&r);
if(find(l)!=find(r)){
puts("-1");
continue;
}
tx=lca(l,r);
printf("%d\n",min(fd_mn(l,dep[l]-dep[tx]),fd_mn(r,dep[r]-dep[tx])));
}
}