#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int INF=0x7fffffff;
const int N=5e5+10;
struct node{
int to,nxt,val;
}edge[N];
int cnt;
int head[N];
void add(int u,int v,int w){
edge[++cnt]={v,head[u],w};
head[u]=cnt;
}
struct fuck{
int fr,to,val;
}edl[N];
bool cmp(fuck pre,fuck nxt){
return pre.val>nxt.val;
}
int fa[N];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void connect(int x,int y){
fa[find(x)]=find(y);
}
bool vst[N];
int dep[N];
int vv[N][30];
int st[N][30];
void build(int pos,int last,int minn){
vst[pos]=true;
st[pos][0]=last;
dep[pos]=dep[last]+1;
vv[pos][0]=minn;
for(int i=head[pos];i!=-1;i=edge[i].nxt){
if(edge[i].to!=last) build(edge[i].to,pos,edge[i].val);
}
}
int n,m,q;
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
cin>>edl[i].fr>>edl[i].to>>edl[i].val;
}
sort(edl+1,edl+m+1,cmp);
for(int i=1;i<=m;i++){
if(find(edl[i].fr)!=find(edl[i].to)){
connect(edl[i].fr,edl[i].to);
add(edl[i].fr,edl[i].to,edl[i].val);
add(edl[i].to,edl[i].fr,edl[i].val);
}
}
for(int i=1;i<=n;i++){
if(!vst[i]) build(i,i,INF);
}
for(int j=1;j<=19;j++){
for(int i=1;i<=n;i++){
if((1<<j)<=dep[i]){
st[i][j]=st[st[i][j-1]][j-1];
vv[i][j]=min(vv[i][j-1],vv[st[i][j-1]][j-1]);
}
}
}
cin>>q;
while(q--){
int a,b;
cin>>a>>b;
if(find(a)!=find(b)){
cout<<"-1\n";
continue;
}
int ans=INF;
if(dep[a]<dep[b]) swap(a,b);
int len=dep[a]-dep[b];
for(int i=19;i>=0;i--){
if((1<<i)<=dep[a]-dep[b]){
a=st[a][i];
ans=min(ans,vv[a][i]);
}
}
if(a==b){
cout<<a<<endl;
continue;
}
for(int i=20;i>=0;i--){
if((1<<i)<=dep[a]&&st[a][i]!=st[b][i]){
ans=min(ans,min(vv[a][i],vv[b][i]));
a=st[a][i];
b=st[b][i];
}
}
cout<<min(ans,min(st[a][0],st[b][0]))<<endl;
}
return 0;
}