#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define P pair<int,int>
using namespace std;
const int maxn=1e6+5,maxm=5e6+5,inf=(1<<31)-1;
int n,m,t,tot,q,U,V;
int f[maxn][20],lg[maxn];
bool vis[maxn];
struct node{
int depth,top,size,son,father1,dfn,val;
int father2;
}a[maxn];
struct line{
int u,v,dis;
}L[maxm];
vector<P> v[maxn];
bool cmp(line x,line y){
return x.dis>y.dis;
}
int find(int k){
if(a[k].father2==k)
return k;
else
return a[k].father2=find(a[k].father2);
}
void kruskal(){
sort(L+1,L+m+1,cmp);
for(int i=1;i<=m;i++){
int fx=find(L[i].u);
int fy=find(L[i].v);
if(fx!=fy){
a[fx].father2=fy;
v[L[i].u].push_back(P(L[i].v,L[i].dis));
v[L[i].v].push_back(P(L[i].u,L[i].dis));
}
}
}
void dfs(int k){
vis[k]=1;
a[k].size=1;
a[k].depth=a[a[k].father1].depth+1;
for(int i=0;i<v[k].size();i++)
if(v[k][i].first!=a[k].father1){
a[v[k][i].first].father1=k;
a[v[k][i].first].val=v[k][i].second;
dfs(v[k][i].first);
a[k].size+=a[v[k][i].first].size;
a[k].son=(!a[k].son||a[a[k].son].size<a[v[k][i].first].size)?v[k][i].first:a[k].son;
}
}
int dfs2(int k,int TOP){
f[tot][0]=a[k].val;
a[k].dfn=++tot;
a[k].top=TOP;
if(a[k].son)
dfs2(a[k].son,a[k].son);
for(int i=0;i<v[k].size();i++)
if(v[k][i].first!=a[k].father1&&v[k][i].first!=a[k].son)
dfs2(v[k][i].first,v[k][i].first);
}
int query(int l,int r){
int num=r-l+1;
return max(f[l][lg[num]],f[r-(1<<lg[num])+1][lg[num]]);
}
int LCA(int x,int y){
int res=inf;
while(a[x].top!=a[y].top){
if(a[a[x].top].depth>a[a[y].top].depth){
res=min(res,query(a[a[x].top].dfn,a[x].dfn-1));
x=a[a[x].top].father1;
}
else{
res=min(res,query(a[a[y].top].dfn,a[y].dfn-1));
y=a[a[y].top].father1;
}
}
if(a[x].depth>a[y].depth)
return min(res,query(a[y].dfn,a[x].dfn-1));
else
return min(res,query(a[x].dfn,a[y].dfn-1));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&L[i].u,&L[i].v,&L[i].dis);
for(int i=1;i<=n;i++){
a[i].father2=i;
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
for(int i=1;i<=n;i++)
lg[i]--;
kruskal();
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i);
dfs2(i,i);
}
}
for(int i=1;i<=20;i++)
for(int j=1;i+(1<<j)-1<tot;j++)
f[j][i]=min(f[j][i-1],f[j+(1<<(i-1))][i-1]);
scanf("%d",&q);
while(q--){
scanf("%d%d",&U,&V);
if(a[U].father2!=a[V].father2)
puts("-1");
else
printf("%d\n",LCA(U,V));
}
}