P1967
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
struct node
{
int u, v, w;
}g[N];
vector<node> g1[N];
int n, m, f[N], fa[N][25], dep[N], w[N][25];
bool vis[N];
bool cmp(node a, node b){
return a.w > b.w;
}
int find(int x)
{
if(f[x] != x) f[x] = find(f[x]);
return f[x];
}
void kruskal()
{
sort(g + 1,g + 1 + m, cmp);
for(int i = 1;i <= n;i ++ ) f[i] = i;
for(int i = 1;i <= m;i ++ )
{
if(find(g[i].u) != find(g[i].v)){
f[find(g[i].u)] = find(g[i].v);
g1[g[i].u].push_back({g[i].v, g[i].w});
g1[g[i].v].push_back({g[i].u, g[i].w});
}
}
}
void dfs(int u)
{
// cout << u << endl;
vis[u] = true;
for(int i = 0;i < g1[u].size();i ++ ){
int v = g1[u][i].v;
if(vis[v]) continue;
dep[v] = dep[u] + 1;
w[v][0] = g1[u][i].w;
fa[v][0] = u;
dfs(v);
}
}
int LCA(int x, int y)
{
if(find(x) != find(y)) return -1;
if(dep[x] < dep[y]) swap(x, y);
int ans = INT_MAX;
for(int i = 20;i >= 0;i -- )
{
if(dep[fa[x][i]] >= dep[y]){
ans = min(ans, w[x][i]);
x = fa[x][i];
}
}
if(x == y) return ans;
for(int i = 20;i >= 0;i -- )
{
if(fa[x][i] != fa[y][i]){
ans = min(ans, min(w[x][i], w[y][i]));
x = fa[x][i], y = fa[y][i];
}
}
ans = min(ans, min(w[x][0], w[y][0]));
return ans;
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= m;i ++){
int x, y, z;
cin >> x >> y >> z;
g[i].u = x;
g[i].v = y;
g[i].w = z;
}
kruskal();
for(int i = 1;i <= n;i ++ )
{
if(!vis[i])
{
dep[i] = 1;
dfs(i);
fa[i][0] = i;
w[i][0] = INT_MAX;
}
}
for(int j = 1;j <= 20;j ++ )
{
for(int i = 1;i <= n;i ++)
{
fa[i][j] = fa[fa[i][j - 1]][j - 1];
w[i][j] = min(w[i][j - 1], w[fa[i][j - 1]][j - 1]);
}
}
int q;
cin >> q;
while(q -- )
{
int x, y;
cin >> x >> y;
cout << LCA(x, y) << endl;
}
return 0;
}