p1967
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+50;
int n,m,q,p[N];
int tot,head[N],next[N<<1],to[N<<1],w[N<<1];
struct Edge{
int x,y,w;
}e[N];
bool cmp(Edge x,Edge y){
return x.w>y.w;
}
void add(int x,int y,int val){
to[tot]=y;
w[tot]=val;
next[tot]=head[x];
head[x]=tot++;
}
int get(int x){
return p[x]==x?x:p[x]=get(p[x]);
}
int deep[N];
int f[N][21],v[N][21];
void dfs(int x){
for(int i=head[x];~i;i=next[i]){
if(to[i]!=f[x][0]){
deep[to[i]]=deep[x]+1;
f[to[i]][0]=x;
v[to[i]][0]=w[i];
dfs(to[i]);
}
}
}
int get_lca_w(int x,int y){
int res=INT_MAX;
if(deep[x]<deep[y]){
swap(x,y);
}
for(int i=20;i>=0;i--){
if(deep[x]-(1<<i)>=deep[y]){
res=min(res,v[x][i]);
x=f[x][i];
}
}
if(x==y) return res;
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
res=min(v[x][i],v[y][i]);
x=f[x][i];
y=f[y][i];
}
}
return min(res,min(v[x][0],v[y][0]));
}
int main(){
memset(head,-1,sizeof head);
ios::sync_with_stdio();
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>e[i].x>>e[i].y>>e[i].w;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++){
p[i]=i;
}
for(int i=1;i<=m;i++){
int x=get(e[i].x);
int y=get(e[i].y);
if(x==y) continue;
p[x]=y;
add(e[i].x,e[i].y,e[i].w);
add(e[i].y,e[i].x,e[i].w);
}
for(int i=1;i<=n;i++){
if(!f[i][0]){
dfs(i);
}
}
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
v[i][j]=min(v[i][j-1],v[f[i][j-1]][j-1]);
}
}
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
if(get(x)!=get(y)) puts("-1");
else cout<<get_lca_w(x,y)<<endl;
}
return 0;
}