#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=10005;
const int inf=0x3f3f3f3f;
int n,m,q,f[N],fa[N][25],dep[N],cnt,ans,lg[N],l[N][25];
struct node{
int v,w;
node(){}
node(int vv,int ww){v=vv,w=ww;}
};
vector<node> G[N];
struct po{int u,v,w;}a[50005];
bool cmp(po x,po y){return x.w>y.w;}
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
void kruskal(){
for(int i=1;i<=m;i++){
int un=find(a[i].u),vn=find(a[i].v);
if(un==vn) continue;
f[vn]=un;
G[a[i].u].push_back(node(a[i].v,a[i].w));
G[a[i].v].push_back(node(a[i].u,a[i].w));
if(++cnt==n-1) return;
}
}
void dfs(int now,int d){
dep[now]=dep[d]+1;
fa[now][0]=d;
for(int i=1;i<=lg[dep[now]];i++){
fa[now][i]=fa[fa[now][i-1]][i-1];
l[now][i]=l[l[now][i-1]][i-1];
}
for(int i=0;i<G[now].size();i++){
int y=G[now][i].v,t=G[now][i].w;
if(y==d) continue;
l[y][0]=t;
dfs(y,now);
}
}
int lca(int u,int v){
if(find(u)!=find(v)) return -1;
ans=inf;
if(dep[u]<dep[v]) swap(u,v);
while(dep[u]>dep[v]){
ans=min(ans,l[u][lg[dep[u]-dep[v]]-1]);
u=fa[u][lg[dep[u]-dep[v]]-1];
}
if(u==v) return ans;
for(int i=lg[dep[u]]-1;i>=0;i--)
if(fa[u][i]!=fa[v][i]){
ans=min(ans,min(l[u][i],l[v][i]));
u=fa[u][i];
v=fa[v][i];
}
ans=min(ans,min(l[u][0],l[v][0]));
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
f[i]=i;
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
sort(a+1,a+1+m,cmp);
kruskal();
dfs(1,0);
scanf("%d",&q);
for(int i=1;i<=q;i++){
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",lca(u,v));
}
return 0;
}