#define Code using
#define by namespace
#define stringdp100005 std
#include<bits/stdc++.h>
#define int long long
Code by stringdp100005;
int n,m,cnt,q;
int fa[100005];
struct node{
int u,v,w;
}a[100005];
struct node2{
int v,w;
};
bool cmp(node x,node y){
return x.w<y.w;
}
vector<node2>g[10005];
int fd(int x){
if(fa[x]==x) return x;
return fa[x]=fd(fa[x]);
}
void jn(int x,int y){
fa[fd(x)]=fd(y);
}
void kruskal(){
for(int i=1;i<=m;i++){
int u=fd(a[i].u),v=fd(a[i].v);
if(u!=v){
g[a[i].u].push_back({a[i].v,a[i].w});
g[a[i].v].push_back({a[i].u,a[i].v});
fa[u]=v;
if(++cnt==n-1) return ;
}
}
}
int f[10005][21];
int dep[10005];
int maxx[10005][21];
void dfs1(int x,int fa,int w){
dep[x]=dep[fa]+1;
f[x][0]=fa;
maxx[x][0]=w;
for(int i=1;i<=20;i++){
f[x][i]=f[f[x][i-1]][i-1];
maxx[x][i]=max(maxx[x][i-1],maxx[f[x][i-1]][i-1]);
}
for(auto u:g[x]){
if(u.v!=fa) dfs1(u.v,x,u.w);
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
x=f[x][i];
}
}
if(x==y) return x;
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int query(int x,int y){
int l=lca(x,y);
int maxxx=0,maxy=0;
for(int i=20;i>=0;i--){
if(dep[x]-(1<<i)>=dep[l]){
maxxx=max(maxx[x][i],maxxx);
x=f[x][i];
}
}
for(int i=20;i>=0;i--){
if(dep[y]-(1<<i)>=dep[l]){
maxy=max(maxx[y][i],maxy);
y=f[y][i];
}
}
return max(maxxx,maxy);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++) cin>>a[i].u>>a[i].v>>a[i].w;
sort(a+1,a+m+1,cmp);
kruskal();
dfs1(1,0,0);
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
cout<<query(u,v)<<"\n";
}
return 0;
}
建树那里错了