

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+5,M=5e4+5;
int n,m,q,fa[N],p[N],dep[N],Fa[N][30],G[N][30];
struct Bian{
int x,y,z;
bool operator < (const Bian &T) const{return z>T.z;}
}e[M];
struct qh{
int v,nt,w;
}E[M];
inline int Rd(){
int s=0,w=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while (ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
inline int Getfa(int x){return fa[x]==x?x:fa[x]=Getfa(fa[x]);}
inline void add(int u,int v,int w){E[++p[0]]=(qh){v,p[u],w};p[u]=p[0];}
inline void Kruskal(){
sort(e+1,e+m+1);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int fx=Getfa(e[i].x),fy=Getfa(e[i].y);
if(fx==fy) continue;
add(e[i].x,e[i].y,e[i].z);
add(e[i].y,e[i].x,e[i].z);
fa[fx]=fy;
}
return ;
}
inline void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=1;i<30;i++){
Fa[u][i]=Fa[Fa[u][i-1]][i-1];
G[u][i]=min(G[u][i-1],G[Fa[u][i-1]][i-1]);
}
for(int i=p[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa) continue;
Fa[v][0]=u;
G[v][0]=E[i].w;
dfs(v,u);
}
}
inline int query(int x,int y){
if(Getfa(x)!=Getfa(y)) return -1;
int mn=G[x][0];
if(dep[x]<dep[y]) swap(x,y);
for(int i=29;i>=0;i--){
if(dep[Fa[x][i]]>=dep[y]){
mn=min(mn,G[x][i]);
x=Fa[x][i];
}
}
if(x==y) return mn;
for(int i=29;i>=0;i--){
if(Fa[x][i]!=Fa[y][i]){
mn=min(mn,min(G[x][i],G[y][i]));
x=Fa[x][i];
y=Fa[y][i];
}
}
mn=min(mn,min(G[x][0],G[y][0]));
return mn;
}
int main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
n=Rd();m=Rd();
for(int i=1;i<=m;i++) e[i].x=Rd(),e[i].y=Rd(),e[i].z=Rd();
for(int i=1;i<=n;i++) G[i][0]=1e9,Fa[i][0]=i;
Kruskal();
dfs(1,0);
q=Rd();
while (q--){
int x=Rd(),y=Rd();
printf("%d\n",query(x,y));
}
return 0;
}