#include<iostream>
#include<algorithm>
#include<vector>
#define ll long long
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=r;i>=l;--i)
#define pb push_back
#define inf (int)1e9
const int N=5e4+5;
int n,m,s,t,f[N][22],fa[N][22],q,father[N],dep[N],cnt=0;
using namespace std;
struct node{
int u,v,w;
}e[N];
bool operator<(const node&x,const node&y){
return x.w>y.w;
}
vector<pair<int,int> > g[N];
inline int fd(int u){
if(u==father[u]) return u;
return father[u]=fd(father[u]);
}
inline void merge(int u,int v){
father[fd(u)]=fd(v);
}
inline void dfs(int u,int fat){
dep[u]=dep[fat]+1;
for(pair<int,int> p:g[u]){
int v=p.first,w=p.second;
if(v==fat) continue;
dep[v]=dep[u]+1;f[v][0]=w;
fa[v][0]=u;
dfs(v,u);
}
}
inline int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int j=19;j>=0;--j){
if(dep[u]-(1<<j)>=dep[v]){
u=fa[u][j];
}
}
if(u==v) return u;
for(int j=19;j>=0;--j){
if(fa[u][j]!=fa[v][j]){
u=fa[u][j];v=fa[v][j];
}
}
return fa[u][0];
}
inline int Min(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
int mn=1e9;
for(int j=19;j>=0;--j){
if(dep[u]-(1<<j)>=dep[v]){
mn=min(mn,f[u][j]);
u=fa[u][j];
}
}
if(u==v) return mn;
for(int j=19;j>=0;--j){
if(fa[u][j]!=fa[v][j]){
mn=min(mn,std::min(f[u][j],f[v][j]));
u=fa[u][j];v=fa[v][j];
}
}
return min({mn,f[u][0],f[v][0]});
}
inline int query(int u,int v){
int l=lca(u,v);
if(!l){
return -1;
}
return Min(u,v);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
up(i,1,m){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+m+1);
up(i,1,n){
father[i]=i;
}
up(i,1,n){
up(j,0,19){
f[i][j]=inf;
}
}
up(i,1,m){
int x=fd(e[i].u),y=fd(e[i].v);
if(x!=y){
merge(x,y);
g[e[i].u].pb({e[i].v,e[i].w});
g[e[i].v].pb({e[i].u,e[i].w});
++cnt;
if(cnt==n-1){
break;
}
}
}
dfs(1,0);
up(j,1,19){
up(i,1,n){
fa[i][j]=fa[fa[i][j-1]][j-1];
f[i][j]=min(f[i][j-1],f[fa[i][j-1]][j-1]);
// printf("f[%d][%d]=%d\n",i,j,f[i][j]);
}
}
cin>>q;
up(i,1,q){
cin>>s>>t;
if(fd(s)!=fd(t)){
cout<<"-1\n";
}else
cout<<query(s,t)<<'\n';
}
cout.flush();
// system("pause");
return 0;
}