rt
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=5e5+7;
LL N,M,QWQ,cnt1,cnt;
LL f[maxn],size[maxn],dep[maxn],W[maxn];
LL head[maxn],nxt[maxn],to[maxn],F[23][maxn],Min[23][maxn];
struct Edge{LL u,v,w;}e[maxn];
void add(LL u,LL v,LL w){
nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;W[cnt]=w;
nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;W[cnt]=w;
}
int cmp(Edge x,Edge y){return x.w>y.w;}
LL getf(LL V){
if(f[V]==V)return V;
return getf(f[V]);
}
void Merge(LL X,LL Y,LL W){
X=getf(X);Y=getf(Y);
if(size[X]>size[Y])swap(X,Y);
size[Y]+=size[X];f[X]=Y;
}
void dfs(int u,int fa,int www){
dep[u]=dep[fa]+1;
F[u][0]=fa;Min[u][0]=www;
for(int i=1;i<=22;i++){
F[u][i]=F[F[u][i-1]][i-1];
Min[u][i]=min(Min[u][i-1],Min[F[u][i-1]][i-1]);
}
for(int i=head[u];i;i=nxt[i])
if(to[i]!=fa)dfs(to[i],u,W[i]);
}
LL CCF(LL u,LL v){
LL ret=1145141919810;
if(dep[u]<dep[v])swap(u,v);
for(int i=22;i>=0;i--){
if(dep[F[u][i]]>=dep[v])
ret=min(ret,Min[u][i]),u=F[u][i];
}
if(u==v)return ret;
for(int i=22;i>=0;i--)
if(F[u][i]!=F[v][i]){
ret=min(ret,min(Min[u][i],Min[v][i]));
u=F[u][i],v=F[v][i];
}
ret=min(ret,min(Min[u][0],Min[v][0]));
return ret;
}
int main(){
scanf("%lld%lld",&N,&M);
for(int i=1;i<=N;i++)f[i]=i,size[i]=1;
for(int i=1;i<=M;i++){
LL x,y,z;cin>>x>>y>>z;
e[++cnt1].u=x;e[cnt1].v=y;e[cnt1].w=z;
}
sort(e+1,e+M+1,cmp);
for(int i=1;i<=M;i++){
LL U=e[i].u,V=e[i].v;
if(getf(U)==getf(V))continue;
Merge(U,V,e[i].w);add(U,V,e[i].w);
}
dfs(1,0,0);
cin>>QWQ;
while(QWQ--){
int u,v;cin>>u>>v;
if(getf(u)!=getf(v)){cout<<-1<<endl;continue;}
cout<<CCF(u,v)<<endl;
}
return 0;
}