#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=(int)2e5+30;
const int INF=(int)1e15+10;
int head[N],to[N],nxt[N],Fa[N],fa[N][30],d[N],v[N],cnt;
bool vis[N];
int w[N][30],p[N][30];
struct node{
int a,b,c;
}e[N];
int find(int x){return Fa[x]==x?x:find(Fa[x]);}
void add(int a,int b,int c){
v[cnt]=c;
to[cnt]=b;
nxt[cnt]=head[a];
head[a]=cnt++;
}
bool cmp(node x,node y){return x.c>y.c;}
void dfs(int node){
vis[node]=true;
for(int i=head[node];i;i=nxt[i]){
int To=to[i];
if(vis[To]) continue;
d[To]=d[node]+1;
fa[To][0]=node;
w[To][0]=v[i];
dfs(To);
}
return;
}
int lca(int x,int y){
if(find(x)!=find(y)) return -1;
int ans=INF;
if(d[x]>d[y]) swap(x,y);
for(int i=25;i>=0;i--){
if(d[fa[y][i]]>=d[x]){
ans=min(ans,w[y][i]);
y=fa[y][i];
}
}
if(x==y) return ans;
for(int i=25;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;
}
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
e[i]={x,y,z};
}
for(int i=1;i<=n;i++) Fa[i]=i;
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++){
int tx=find(e[i].a),ty=find(e[i].b);
if(tx!=ty){
Fa[tx]=ty;
add(e[i].a,e[i].b,e[i].c);
add(e[i].b,e[i].a,e[i].c);
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
d[i]=1;
dfs(i);
fa[i][0]=i;
w[i][0]=INF;
}
}
for(int i=1;i<=25;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]);
}
}
int q;
scanf("%lld",&q);
while(q--){
int x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",lca(x,y));
}
return 0;
}