#include <bits/stdc++.h>
using namespace std;
const int N=50000+50;
const int Maxn=0x3f3f3f3f;
int cnt,tot,fir[N<<1],f[25][N],dep[N],val[25][N];
int ff[N],n,ans,m,q;
int fff[N];
struct edge{
int x,y,w;
int nxt,to;
}e[N<<1],eg[N<<1];
inline int read(){
int cnt=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
return cnt*f;
}
inline void adde(int x,int y,int z){eg[++cnt].nxt=fir[x];fir[x]=cnt;eg[cnt].to=y;eg[cnt].w=z;}
void dfs(int u,int fa){
f[0][u]=fa;dep[u]=dep[fa]+1;
for(int i=fir[u];i;i=eg[i].nxt){
int v=eg[i].to;if(v==fa) continue;
val[0][v]=eg[i].w;
dfs(v,u);
}
}
inline int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;--i) if(dep[f[i][x]]>dep[y]) x=f[i][x],ans=min(ans,val[i][x]);
if(x==y) return ans;
for(int i=20;i>=0;--i) if(f[i][x]!=f[i][y]) x=f[i][x],y=f[i][y],ans=min(ans,min(val[i][x],val[i][y]));
ans=min(ans,min(val[0][x],val[0][y]));
return ans;
}
inline void add(int x,int y,int z){e[++tot].x=x,e[tot].y=y,e[tot].w=z;}
inline bool cmp(const edge &a,const edge &b){return a.w>b.w;}
inline int getfa(int x){return ff[x]==x?x:ff[x]=getfa(ff[x]);}
inline int find(int x){return fff[x]==x?x:fff[x]=find(fff[x]);}
inline void Kruskal(){
for(int i=1;i<=n;++i) fff[i]=ff[i]=i;
sort(e+1,e+1+m,cmp);cnt=0;
for(int i=1;i<=m;++i){
int x=e[i].x,y=e[i].y,w=e[i].w;
int fx=getfa(x),fy=getfa(y);
if(fx==fy) continue;
adde(x,y,w);adde(y,x,w);
// fff[find(x)]=find(y);
ff[fx]=fy;
}
return;
}
signed main(){
n=read(),m=read();
int x,y,z;
for(int i=1;i<=m;++i){
x=read(),y=read(),z=read();
add(x,y,z);add(y,x,z);
}
Kruskal();
for(int i=1;i<=n;++i)
if(fff[i]==i)
val[0][i]=Maxn,dfs(i,i);
for(int i=1;i<=20;++i){
for(int j=1;j<=n;++j){
f[i][j]=f[i-1][f[i-1][j]];
val[i][j]=min(val[i-1][j],val[i-1][f[i-1][j]]);
}
}
q=read();
for(int i=1;i<=q;++i){
ans=Maxn;
x=read(),y=read();
if(ff[getfa(x)]!=getfa(y)){
printf("-1\n");continue;
}
int Lca=LCA(x,y);
printf("%d\n",Lca);
}
return 0;
}