#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
#define pi pair<int, int>
#define M 500010
#define N 100010
#define K 20
using namespace std;
int n, m, fa[M], de[M], sum[M][K+2], f[M][K+2], cnt=0;
bool vis[M];
vector<pi> v[M];
struct node{
int x, y, z;
}sz[M];
bool operator<(node a, node b){
return a.z > b.z;
}
int getfa(int a){
if(fa[a] == a){
return a;
}
fa[a] = getfa(fa[a]);
return fa[a];
}
void add(int x, int y, int z){
v[x].push_back({y, z});
v[y].push_back({x, z});
}
void dfs(int u, int fa){
f[u][0]=fa;
de[u]=de[fa]+1;
vis[u]=1;
for(int j=1;j<=K;j++){
f[u][j]=f[f[u][j-1]][j-1];
sum[u][j] = min(sum[u][j-1], sum[f[u][j-1]][j-1]);
}
for(pi a : v[u]){
int y = a.first;
if(y == fa){
continue;
}
sum[y][0] = a.second;
dfs(y, u);
}
}
int lca(int x, int y){
if(de[x]<de[y])swap(x, y);
int ans = 1e9;
for(int i=K;i>=0;i--){
if(de[f[x][i]] >= de[y]){
ans = min(ans, sum[x][i]);
x = f[x][i];
}
}
if(x == y){
return ans;
}
for(int i=K;i>=0;i--){
if(f[x][i] != f[y][i]){
ans = min(ans, min(sum[x][i], sum[y][i]));
x = f[x][i];
y = f[y][i];
}
}
ans = min(ans, min(sum[x][0], sum[y][0]));
return ans;
}
int main(){
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++){
fa[i] = i;
}
for(int i=1;i<=m;i++){
scanf("%d%d%d", &sz[i].x, &sz[i].y, &sz[i].z);
}
sort(sz+1, sz+m+1);
int tot = 0;
for(int i=1;i<=m && tot < n-1;i++){
int x = getfa(sz[i].x);
int y = getfa(sz[i].y);
if(x != y){
fa[x] = y;
tot++;
add(sz[i].x, sz[i].y, sz[i].z);
add(sz[i].y, sz[i].x, sz[i].z);
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i, 0);
}
}
int q;
scanf("%d", &q);
for(int i=1;i<=q;i++){
int x, y;
scanf("%d%d", &x, &y);
if(getfa(x) != getfa(y)){
printf("-1\n");
continue;
}
printf("%d\n", lca(x, y));
}
return 0;
}