#include<bits/stdc++.h>
#define inf 999999999
using namespace std;
const int N=10005;
int cnt,n,m,q,head[N],deep[N],f[N],fa[N][21],w[N][21];
struct edge{
int x,y,dis;
}tu[50005];
struct eg{
int to,nxt,w;
}btr[100005];
bool vis[N];
void add(int x,int y,int z){
btr[++cnt].nxt=head[x];
btr[cnt].to=y;
btr[cnt].w=z;
head[x]=cnt;
return;
}
bool cmp(edge a,edge b){
return a.dis>b.dis;
}
int find(int x){
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
void init(){
sort(tu+1,tu+m+1,cmp);
for(int i=1;i<=n;++i)
f[i]=i;
}
void kruskal(){
for(int i=1;i<=m;++i)
if(find(tu[i].x)!=find(tu[i].y)){
f[find(tu[i].x)]=find(tu[i].y);
add(tu[i].x,tu[i].y,tu[i].dis);
add(tu[i].y,tu[i].x,tu[i].dis);
}
return;
}
void dfs(int node){
vis[node]=1;
for(int i=head[node];i;i=btr[i].nxt){
int to=btr[i].to;
if(vis[to]) continue;
deep[to]=deep[node]+1;
fa[to][0]=node;
w[to][0]=btr[i].w;
dfs(to);
}
return;
}
int lca(int x,int y){
if(find(x)!=find(y)) return -1;
int ans=inf;
if(deep[x]>deep[y]) swap(x,y);
for(int i=20; i>=0; i--)
if(deep[fa[y][i]]>=deep[x]){
ans=min(ans, w[y][i]);
y=fa[y][i];
}
if(x==y) return ans;
for(int i=20; i>=0; i--)
if(fa[x][i]!=fa[y][i]){
ans=min(ans, min(w[x][i], w[y][i]));
x=fa[x][i];
y=fa[y][i];
}
ans=min(ans, min(w[x][0], w[y][0]));
return ans;
}
int main(){
cin>>n>>m;
int x,y,z,q;
for(int i=1;i<=m;++i){
cin>>x>>y>>z;
tu[i].x=x;
tu[i].y=y;
tu[i].dis=z;
}
kruskal();
for(int i=1;i<=n;++i)
if(!vis[i]){
deep[i]=1;
dfs(i);fa[i][0]=i;
w[i][0]=inf;
}
for(int i=1;i<=20;++i)
for(int j=1;j<=n;++j){
fa[j][i]=fa[fa[j][i-1]][i-1];
w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
}
cin>>q;
while(q--){
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}