code
#include <bits/stdc++.h>
using namespace std;
namespace Syxqwq {
inline int read() {
int x = 0, s = 1;
char c = getchar();
while (c > '9' || c < '0') {
if (c == '-') s = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c - '0');
c = getchar();
}
return x * s;
}
void Write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
inline void write(int x, char c) {
Write(x), putchar(c);
}
}
using namespace Syxqwq;
const int N = 2e5 + 10;
int head[N], f[N][21], g[N][21], fa[N], depth[N], n, m, ans, idx;
struct edge {
int u, v, z, nxt;
} e[N];
struct node {
int u, v, z;
} nd[N];
inline void insert(int x, int v, int z) {
e[++idx].u = x;
e[idx].v = v;
e[idx].z = z;
e[idx].nxt = head[x];
head[x] = idx;
}
inline void initlca() {
for (int j = 1; j <= 20; ++j) for (int i = 1; i <= n; ++i) {
g[i][j] = max(g[i][j - 1], g[f[i][j - 1]][j - 1]);
f[i][j] = f[f[i][j - 1]][j - 1];
}
}
void dfs(int u, int F, int c, int val) {
f[u][0] = F;
depth[u] = c;
g[u][0] = val;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (v != F) dfs(v, u, c + 1, e[i].z);
}
}
int LCA(int a, int b) {
if (depth[a] < depth[b]) swap(a, b);
int ret = 0;
int t = depth[a] - depth[b];
for (int i = 0; i <= 20; ++i) if (t & (1 << i)) {
ret = max(ret, g[a][i]);
a = f[a][i];
}
for (int i = 20; i >= 0; --i) if (f[a][i] != f[b][i]) {
ret = max(ret, g[a][i]);
ret = max(ret, g[b][i]);
a = f[a][i];
b = f[b][i];
}
ret = max(ret, max(g[a][0], g[b][0]));
return ret;
}
inline int find(int x) {
while (x != fa[x]) x = fa[x] = fa[fa[x]];
return x;
}
inline void kruscal() {
int cnt = 0;
for (int i = 1; i <= m; ++i) {
int fa1 = find(nd[i].u), fa2 = find(nd[i].v);
if (fa1 != fa2) {
fa[fa2] = fa1;
cnt++;
insert(nd[i].u, nd[i].v, nd[i].z);
insert(nd[i].v, nd[i].u, nd[i].z);
}
if (cnt == n - 1) break;
}
}
int main() {
n = read(), m = read();
for (int i = 1; i <= m; ++i) {
nd[i].u = read(), nd[i].v = read(), nd[i].z = read();
}
sort(nd + 1, nd + m + 1, [&](node a, node b) {return a.z < b.z;});
for (int i = 1; i <= n; ++i) fa[i] = i;
kruscal();
int t = read();
dfs(1, 0, 0, 0);
initlca();
while (t--) {
int x = read(), y = read();
printf("%d\n", LCA(x, y));
}
return 0;
}
