rt
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=1e5+7;
LL N,M,QWQ,cnt1,cnt;
LL f[maxn],size[maxn],dep[maxn],up[maxn],id[maxn];
LL head[maxn],nxt[maxn],to[maxn],book[maxn];
struct Edge{LL u,v,w;}e[maxn];
void add(LL u,LL v,LL w,LL ID){
e[++cnt1].u=u;e[cnt1].v=v;e[cnt1].w=w;
nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;id[cnt]=ID;
nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;id[cnt]=ID;
}
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;up[X]=W;
}
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=nxt[i])
if(to[i]!=fa&&book[id[i]])dfs(to[i],u);
}
LL CCF(LL u,LL v){
LL ret=1145141919810;
if(dep[u]<dep[v])swap(u,v);
while(dep[u]>dep[v])ret=min(ret,up[u]),u=f[u];
while(f[u]!=u&&f[v]!=v)ret=min(ret,min(up[u],up[v])),u=f[u],v=f[v];
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;add(x,y,z,i);}
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);book[i]=1;
}
dfs(1,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;
}