#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,cnt1,bf[100010],q;
int f[100010][20],lg[100010],l[100010][20],rt,d[100010];
vector<int>g[100010];
struct edge{
int from,to,l;
}e[600010];
bool cmp(edge a,edge b){
return a.l<b.l;
}
int fin(int x){
return (bf[x]==x?x:bf[x]=fin(bf[x]));
}
bool add(int x,int y){
x=fin(x),y=fin(y);
if(x!=y){
bf[y]=x;
return 1;
}
return 0;
}
void dfs(int x){
for(int i=0;i<g[x].size();i++){
int to=g[x][i];
if(to!=f[x][0]){
d[to]=d[x]+1;
dfs(to);
}
}
return ;
}
int LCA(int x,int y){
int ans=0;
if(d[x]<d[y]){
swap(x,y);
}
while(d[x]>d[y]){
ans=max(ans,l[x][lg[d[x]-d[y]]]);
x=f[x][lg[d[x]-d[y]]];
}
if(x==y){
return ans;
}
for(int i=lg[n];i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=max(ans,max(l[x][i],l[y][i]));
x=f[x][i];
y=f[y][i];
}
}
ans=max(ans,max(l[x][0],l[y][0]));
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
bf[i]=i;
}
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
e[++cnt]={x,y,z};
e[++cnt]={y,x,z};
}
sort(e+1,e+m*2+1,cmp);
for(int i=1;i<=2*m;i++){
if(add(e[i].from,e[i].to)){
f[e[i].to][0]=e[i].from;
l[e[i].to][0]=e[i].l;
g[e[i].from].push_back(e[i].to);
cnt1++;
if(cnt1==n-1){
break;
}
}
}
lg[0]=-1;
for(int i=1;i<=n;i++){
lg[i]=lg[i>>1]+1;
if(f[i][0]==0){
rt=i;
}
}
dfs(rt);
for(int i=1;i<=lg[n];i++){
for(int j=1;j<=n;j++){
f[j][i]=f[f[j][i-1]][i-1];
l[j][i]=max(l[j][i-1],l[f[j][i-1]][i-1]);
}
}
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
cout<<LCA(x,y)<<"\n";
}
return 0;
}