#include <bits/stdc++.h>
using namespace std;
const int MN=50005,inf=2e9-1;
int n,m,f[MN],minw[MN][20],dep[MN],anc[MN][20],num;
bool vis[MN];
struct edge{
int u,v,w;
}e[MN];
bool cmp(edge a,edge b){
return a.w>b.w;
}
vector<pair<int,int> > t[MN];
int find(int u){
if(u!=f[u])return f[u]=find(f[u]);
return u;
}
void kruskal(){
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++){
int u=find(e[i].u),v=find(e[i].v);
if(u==v){
continue;
}
f[u]=v;
t[u].push_back(make_pair(v,e[i].w));
t[v].push_back(make_pair(u,e[i].w));
if(++num==n)return;
}
}
int getw(int u,int v){
for(int i=0;i<t[u].size();i++){
if(t[u][i].first==v){
return t[u][i].second;
}
}
}
void dfs(int u,int f1){
vis[u]=1;
for(int i=0;i<t[u].size();i++){
int v=t[u][i].first;
if(v==f1)continue;
dep[v]=dep[u]+1;
minw[v][0]=getw(v,u);
anc[v][0]=u;
dfs(v,u);
}
}
void init(){
for(int k=1;k<=19;k++){
for(int i=1;i<=n;i++){
anc[i][k]=anc[anc[i][k-1]][k-1];
minw[i][k]=min(minw[i][k-1],minw[minw[i][k-1]][k-1]);
}
}
}
int lca(int u,int v){
int ans=inf;
if(find(u)!=find(v)){
return -1;
}
if(dep[u]<dep[v])swap(u,v);
for(int i=19;i>=0;i--){
if(dep[anc[u][i]]>=dep[v]){
ans=minw[u][i];
u=anc[u][i];
}
}
if(u==v)return ans;
for(int i=19;i>=0;i--){
if(anc[u][i]!=anc[v][i]){
ans=min(ans,minw[u][i]);
ans=min(ans,minw[v][i]);
u=anc[u][i],v=anc[v][i];
}
}
ans=min(ans,minw[u][0]);
ans=min(ans,minw[v][0]);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)cin>>e[i].u>>e[i].v>>e[i].w;
kruskal();
for(inti=1;i<=n;i++)if(!vis[i])dep[i]=1,dfs(i,0);
init();
int q;
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
cout<<lca(u,v)<<endl;
}
return 0;
}