#include<bits/stdc++.h>
#define maxn 500005
using namespace std;
int n,m,Q;
int fa[maxn],dep[maxn],f[maxn][50],minn[maxn][50],lg[maxn];
//f[i][j]表示i的第pow(2,j)的祖宗
//minn[i][j]表示从i到i的第pow(2,j)的祖宗这条路径上的最小边权
//dep[i]表示深度
//fa[i]维护并查集
struct node{
int to,len;
};
vector<node>p[maxn];
struct edge{
int u,v,w;
}e[maxn];
bool cmp(edge x,edge y){
return x.w>y.w;
}
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void kruskal(){
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
int fx=find(e[i].u),fy=find(e[i].v);
if(fx==fy)continue;
fa[fx]=fy;
p[e[i].u].push_back((node){e[i].v,e[i].w});
p[e[i].v].push_back((node){e[i].u,e[i].w});
}
}
void dfs(int x,int father,int Len){
dep[x]=dep[father]+1;
f[x][0]=father;
minn[x][0]=Len;
for(int i=1;i<=20;i++){
f[x][i]=f[f[x][i-1]][i-1];
minn[x][i]=min(minn[x][i],minn[minn[x][i-1]][i-1]);
}
for(int i=0;i<p[x].size();i++){
int y=p[x][i].to;
if(y==father)continue;
dfs(y,x,p[x][i].len);
}
}
int lca(int x,int y){
if(find(x)!=find(y))return -1;
int ans=1e9;
if(dep[x]<dep[y])swap(x,y);
while(dep[x]>dep[y]){
ans=min(ans,minn[x][dep[x]-dep[y]]);
x=f[x][dep[x]-dep[y]];
}
if(x==y)return ans;
for(int i=lg[dep[x]];i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=min(ans,minn[x][i]);
ans=min(ans,minn[y][i]);
x=f[x][i];
y=f[y][i];
}
}
ans=min(ans,minn[x][0]);
ans=min(ans,minn[y][0]);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
}
kruskal();
for(int i=2;i<=n;i++){
lg[i]=lg[i/2]+1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=30;j++){
minn[i][j]=1e9;
}
}
dfs(1,0,0);
cin>>Q;
while(Q--){
int a,b;
cin>>a>>b;
cout<<lca(a,b)<<endl;
}
return 0;
}