
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
struct node {
int u, v, w;
node() {}
node(int x, int y, int z) {
u = x, v = y, w = z;
}
} e[50010];
vector<pair<int, int> > g[10010];
bool vis[10010];
bool cmp(node a, node b) { return a.w > b.w; }
int fa[10010];
int find(int u) { if (fa[u] == u) return u; else return fa[u] = find(fa[u]); }
int dep[10010], p[10010][20], q[10010][20];
void dfs(int u, int f) {
vis[u] = 1;
dep[u] = dep[f] + 1;
for (int i = 0; i < g[u].size(); i++) {
#define v g[u][i].first
#define w g[u][i].second
if (v == f) continue;
p[v][0] = u, q[v][0] = w;
dfs(v, u);
#undef v
#undef w
}
}
int lca(int u, int v) {
int res = 1e9;
if (dep[u] < dep[v]) swap(u, v);
for (int i = 20; i >= 0; i--)
if (dep[p[u][i]] >= dep[v]) res = min(res, q[u][i]), u = p[u][i];
if (u == v) return res;
for (int i = 20; i >= 0; i--)
if (p[u][i] != p[v][i]) res = min(res, min(q[u][i], q[v][i])), u = p[u][i], v = p[v][i];
return min(res, min(q[u][0], q[v][0]));
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
sort(e + 1, e + m + 1, cmp);
for (int i = 1; i <= m; i++) {
if (find(e[i].u) != find(e[i].v)) {
g[e[i].u].push_back(make_pair(e[i].v, e[i].w));
g[e[i].v].push_back(make_pair(e[i].u, e[i].w));
fa[find(e[i].u)] = find(e[i].v);
}
}
for (int i = 1; i <= n; i++)
if (!vis[i]) {
p[i][0] = i;
q[i][0] = 1e9;
dfs(i, 0);
}
for (int j = 1; j <= 20; j++)
for (int v = 1; v <= n; v++)
p[v][j] = p[p[v][j - 1]][j - 1], q[v][j] = min(q[v][j - 1], q[p[v][j - 1]][j - 1]);
int qaq; cin >> qaq;
while (qaq--) {
int u, v;
cin >> u >> v;
if (find(u) != find(v)) cout << "-1\n";
else cout << lca(u, v) << '\n';
}
return 0;
}