rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e4+5,inf=0x3f3f3f3f;
struct bian{
int u,v,w;
bool operator < (const bian &o)const{return w>o.w;}
}bian[N<<1];
int n,m,fa[N];
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct Edge{
int to,w,next;
}edge[N<<1];int cnt(0),head[N];
inline void add(int x,int y,int w){
edge[++cnt]=Edge{y,w,head[x]};
head[x]=cnt;
}
void Kruskal(){
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int u=bian[i].u,v=bian[i].v,w=bian[i].w;
if(find(u)!=find(v)){
fa[find(u)]=fa[find(v)];
add(u,v,w);
add(v,u,w);
}
}
}
bool vis[N];
int f[N][20],w[N][20],dep[N];
void dfs(int u){
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,W=edge[i].w;
if(vis[v]) continue;
dep[v]=dep[u]+1;
f[v][0]=u;
w[v][0]=W;
dfs(v);
}
}
inline int getans(int x,int y){
if(find(x)!=find(y)) return -1;
int ans(inf);
if(dep[x]>dep[y]) swap(x,y);
for(int i=20;i>=0;i--){
if(dep[f[y][i]]>=dep[x]){
ans=min(ans,w[y][i]);
y=f[y][i];
}
}
if(x==y) return ans;
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=min(ans,w[x][i]);
ans=min(ans,w[y][i]);
x=f[x][i];
y=f[y][i];
}
}
ans=min(ans,w[x][0]);
ans=min(ans,w[y][0]);
return ans;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>bian[i].u>>bian[i].v>>bian[i].w;
}
sort(bian+1,bian+1+m);
Kruskal();
for(int i=1;i<=n;i++){
if(!vis[i]){
dep[i]=1;
dfs(i);
f[i][0]=i;
w[i][0]=inf;
}
}
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
w[i][j]=min(w[i][j-1],w[f[i][j-1]][j-1]);
}
}
int Q;
cin>>Q;
for(int i=1;i<=Q;i++){
int x,y;
cin>>x>>y;
cout<<getans(x,y)<<"\n";
}
return 0;
}