voiddfs(int u, int fa) { d[u] = d[fa] + 1; // 深度 for (int i = h[u]; i; i = edge[i].ne) { int v = edge[i].to; if (v == fa) continue; f[v][0] = u; // 倍增数组,在dfs过程中求出祖先 forr(k, 1, 20) if(f[v][k - 1]) f[v][k] = f[f[v][k - 1]][k - 1]; else break; dfs(v, u); } }
intlca(int a, int b) { if (d[a] > d[b]) swap(a, b); for (int i = 20; i >= 0; i--) if (d[f[b][i]] >= d[a]) b = f[b][i]; if (a == b) return a; for (int i = 20; i >= 0; i--) if (f[a][i] != f[b][i]) a = f[a][i], b = f[b][i]; return f[a][0]; }
typedeflonglong ll; int pri[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53}; constint inf = 0x3f3f3f3f; constint N = 1e6 + 10; int n, m; structnode { int u, v, w; booloperator<(const node &t) const { return w > t.w; } } e[50005]; structnod { int to, ne; } edge[20005]; int h[20005], cnt = 1; int pre[20005]; int val[20005]; int d[20005]; int f[20005][21]; int tot; voidadd(int u, int v) { edge[++cnt] = {v, h[u]}; h[u] = cnt; }
intfind(int x) { return x == pre[x] ? x : pre[x] = find(pre[x]); }
voiddfs(int u, int fa) { d[u] = d[fa] + 1; //cout <<u <<" "<< d[u] << endl; for (int i = h[u]; i; i = edge[i].ne) { int v = edge[i].to; if (v == fa) continue; f[v][0] = u; forr(k, 1, 20) if(f[v][k - 1]) f[v][k] = f[f[v][k - 1]][k - 1]; else break; dfs(v, u); } }
voidkruskal() { sort(e + 1, e + 1 + m); forr(i, 1, n) pre[i] = i; tot = n; forr(i, 1, m) { int a = find(e[i].u), b = find(e[i].v); if (a != b) { val[++tot] = e[i].w; pre[tot] = pre[a] = pre[b] = tot; add(tot, a); add(a, tot); add(tot, b); add(b, tot); } } for (int i = tot; i >= 1; i--) { if (!d[i]) dfs(i, -1); } } intlca(int a, int b) { if (d[a] > d[b]) swap(a, b); for (int i = 20; i >= 0; i--) if (d[f[b][i]] >= d[a]) b = f[b][i]; if (a == b) return a; for (int i = 20; i >= 0; i--) if (f[a][i] != f[b][i]) a = f[a][i], b = f[b][i]; return f[a][0]; }
signedmain() { // _orz; cin >> n >> m; forr(i, 1, m) { int u, v, w; cin >> u >> v >> w; e[i] = {u, v, w}; } kruskal(); int q;cin>>q; while(q--){ int x,y;cin>>x>>y; if(find(x)^find(y)) puts("-1"); else cout << val[lca(x,y)] << endl; } return0; }