#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m;
struct a1{
int u,v,w;
}a[N];
struct node{
int v,w;
};
vector<node>s[N];
int f[N];
void init(){
for(int i=1;i<=n;i++){
f[i]=i;
}
}
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
bool cmp(a1 a,a1 b){
return a.w>b.w;
}
void kruskal(){
sort(a+1,a+m+1,cmp);
int sum=0;
for(int i=1;i<=m;i++){
int u=find(a[i].u);
int v=find(a[i].v);
if(u!=v){
s[a[i].u].push_back(node{a[i].v,a[i].w});
s[a[i].v].push_back(node{a[i].u,a[i].w});
f[u]=v;
}
}
}
int w[N],wt[N],dep[N],son[N],id[N],fa[N],siz[N],cnt,top[N];
int tree[N*4];
void push_up(int p){
tree[p]=min(tree[p*2],tree[p*2+1]);
}
void build(int p,int l,int r){
if(l==r) {
tree[p]=wt[l];
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
push_up(p);
return ;
}
int query_min(int p,int l,int r,int nl,int nr){
int ans=0x7ffffff;
int mid=(l+r)/2;
if(nl<=l&&r<=nr){
return tree[p];
}
if(nl<=mid) ans=min(ans,query_min(p*2,l,mid,nl,nr));
if(mid<nr) ans=min(ans,query_min(p*2+1,mid+1,r,nl,nr));
return ans;
}
void dfs1(int x,int f){
dep[x]=dep[f]+1;
fa[x]=f;
siz[x]=1;
int maxson=0;
for(int i=0;i<s[x].size();i++){
int y=s[x][i].v;
if(y==f) continue;
w[y]=s[x][i].w;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>maxson){
maxson=siz[y];
son[x]=y;
}
}
}
void dfs2(int x,int topf){
cnt++;
top[x]=topf;
id[x]=cnt;
wt[cnt]=w[x];
if(!son[x]) return ;
dfs2(son[x],topf);
for(int i=0;i<s[x].size();i++){
int y=s[x][i].v;
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
}
int cao1(int x,int y){
if(find(x)!=find(y)){
return -1;
}
int ans=0x7ffffff;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=min(ans,query_min(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(x==y){
return ans;
}
if(dep[x]>dep[y]){
swap(x,y);
}
ans=min(ans,query_min(1,1,n,id[x]+1,id[y]));
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].u>>a[i].v>>a[i].w;
}
init();
kruskal();
dfs1(1,1);
dfs2(1,1);
build(1,1,n);
int q;
cin>>q;
int u,v;
for(int i=1;i<=q;i++){
cin>>u>>v;
cout<<cao1(u,v)<<endl;
}
return 0;
}