#include<iostream>
#include<algorithm>
using namespace std;
#define zql continue
const int maxn=1005;
const int maxm=50005;
int n,m,q,cnt;
int h[maxn],fa[maxn];
int vis[maxn],d[maxn],dis[maxn];
struct edge{
int to,next,data;
}a[maxm*2];
struct K{
int x,y,data;
}e[maxm];
bool cmp(K x,K y){
return x.data>y.data;
}
void addedge(int x,int y,int z){
a[++cnt].to=y;
a[cnt].data=z;
a[cnt].next=h[x];
h[x]=cnt;
}
int getf(int x){
while(x!=fa[x]) x=fa[x]=fa[fa[x]];
return x;
}
void dfs(int x){
vis[x]=1;
for(int i=h[x];i;i=a[i].next)
if(!vis[a[i].to]){
fa[a[i].to]=x;
dis[a[i].to]=a[i].data;
d[a[i].to]=d[x]+1;
dfs(a[i].to);
}
}
void kruskal(){
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++){
int u=getf(e[i].x);
int v=getf(e[i].y);
if(u!=v){
fa[u]=v;
addedge(e[i].x,e[i].y,e[i].data);
addedge(e[i].y,e[i].x,e[i].data);
}
}
}
int lca(int x,int y){
if(getf(x)!=getf(y))return -1;
int minn=0x3f3f3f3f;
if(d[x]<d[y])swap(x,y);
while(d[x]>d[y]){
y=fa[y];
minn=min(minn,dis[y]);
}
while(x!=y){
minn=min(minn,dis[x]);
minn=min(minn,dis[y]);
x=fa[x];
y=fa[y];
}
return minn;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y>>e[i].data;
kruskal();
dfs(1);
cin>>q;
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<"\n";
}
}