#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m;
struct code{
int u,v,x;
};
vector<code> edge,op[N];
int fa[N];
code k[N];
int dis[N];
bool cmp(code x,code y){
return x.x>y.x;
}
int find(int x){
if(x==fa[x]) return x;
return find(fa[x]);
}
void unionn(int x,int y){
x=find(x);
y=find(y);
fa[x]=y;
return ;
}
void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=0;i<m;i++){
int u=edge[i].u;
int v=edge[i].v;
if(find(u)!=find(v)){
unionn(u,v);
op[u].push_back({u,v,edge[i].x});
op[v].push_back({v,u,edge[i].x});
}
}
return ;
}
void father(int u,int f){
dis[u]=dis[f]+1;
for(int i=0;i<op[u].size();i++){
int v=op[u][i].v;
if(v==f) continue;
k[v]={v,u,op[u][i].x};
father(v,u);
}
return ;
}
int lca(int x,int y){
int mn=1e9;
if(dis[x]<dis[y]) swap(x,y);
int p=dis[x]-dis[y];
for(int i=1;i<=p;i++){
mn=min(mn,k[x].x);
x=k[x].v;
}
int sum=0;
while(x!=y){
sum++;
mn=min(mn,k[x].x);
mn=min(mn,k[y].x);
x=k[x].v;
y=k[y].v;
if(sum>n) return -1;
}
return mn;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,x;
cin>>u>>v>>x;
edge.push_back({u,v,x});
}
sort(edge.begin(),edge.end(),cmp);
init();
k[1]={1,1,0};
father(1,0);
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<"\n";
}
return 0;
}
Hack过不去