#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int d[N],father[N][30],mx[N][30];
struct edge{
int v,w;
};
vector<edge> e[N];
int n,m,q;
void dfs(int x,int fa,int va){
father[x][0] = fa;
mx[x][0] = va;
d[x] = d[fa] + 1;
for(int i = 1;i <= 29;i ++){
father[x][i] = father[father[x][i - 1]][i - 1];
mx[x][i] = min(mx[x][i - 1],mx[father[x][i - 1]][i - 1]);
}
for(int i = 0;i < e[x].size();i ++){
int y = e[x][i].v,z = e[x][i].w;
if(y != fa) dfs(y,x,z);
}
}
int LCA(int x,int y){
int ans = 2e9;
if(d[x] > d[y]) swap(x,y);
for(int i = 29;i >= 0;i --){
if(d[father[y][i]] >= d[x]){
ans = min(ans,mx[y][i]);
y = father[y][i];
}
}
if(x == y) return ans;
for(int i = 29;i >= 0;i --){
if(father[x][i] != father[y][i]){
ans = min(ans,min(mx[x][i],mx[y][i]));
x = father[x][i];
y = father[y][i];
}
}
return min(ans,min(mx[x][0],mx[y][0]));
}
int fa[N];
struct node{
int u,v,w;
}a[N];
bool cmp(node x,node y){
return x.w > y.w;
}
int find(int x){
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
int 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);
for(int i = 1;i <= m;i ++){
int fu = find(a[i].u),fv = find(a[i].v);
if(fu == fv) continue;
e[a[i].u].push_back({a[i].v,a[i].w});
e[a[i].v].push_back({a[i].u,a[i].w});
fa[fu] = fv;
}
dfs(1,0,2e9);
cin >> q;
while(q --){
int x,y;
cin >> x >> y;
if(find(x) != find(y)) cout << "-1\n";
else cout << LCA(x,y) << "\n";
}
return 0;
}
#1测试点WA了,求助