/**
* author: skmonir
* created: 01-Feb-2018 19:31:07
**/
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define TN typename
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define mem(x, y) memset(x, y, sizeof x)
#define FOR(x, l, r) for (int x = l; x <= r; ++x)
#define ROF(x, l, r) for (int x = l; x >= r; --x)
template <TN T> inline void Int(T &n) {
n = 0; int f = 1; register int ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) n = (n << 3) + (n << 1) + ch - '0';
n = n * f;
}
template <TN T> T gcd(T a, T b) {return !b ? a : gcd(b, a % b);}
template <TN T> inline void umin(T &a, T b) {a = a < b ? a : b;}
template <TN T> inline void umax(T &a, T b) {a = a > b ? a : b;}
template <TN T, TN W> inline void Int(T &x, W &y) {Int(x), Int(y);}
template <TN T, TN W, TN Q> inline void Int(T &x, W &y, Q &z) {Int(x, y), Int(z);}
const int N = 1e5 + 7;
const int inf = 1e9 + 7;
const int mod = 1e9 + 7;
vector <int> idx[N];
vector < pair <int, int> > g[N];
int n, chain, a[N], head[N], belong[N], pos[N];
int dep[N], Par[N][25], sub[N], edgeEnd[N], t[N << 2];
void dfs(int u, int p) {
sub[u] = 1;
Par[u][0] = p;
dep[u] = dep[p] + 1;
for (int i = 1; i <= 20; i++) {
Par[u][i] = Par[Par[u][i - 1]][i - 1];
}
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].first;
if (v != p) {
dfs(v, u);
edgeEnd[idx[u][i]] = v;
sub[u] += sub[v];
}
}
}
int LCA(int a, int b) {
if (dep[a] < dep[b]) swap(a, b);
int dis = dep[a] - dep[b];
for (int i = 20; i >= 0; i--) {
if (dis & (1 << i)) a = Par[a][i];
}
for (int i = 20; i >= 0; i--) {
if (Par[a][i] != Par[b][i]) {
a = Par[a][i], b = Par[b][i];
}
}
return a == b ? a : Par[a][0];
}
void upd(int nd, int s, int e, int l, int r, int w) {
if (e < l or r < s) return;
if (s >= l and e <= r) {
t[nd] = w; return;
}
int md = (s + e) >> 1;
upd(nd << 1, s, md, l, r, w);
upd(nd << 1 | 1, md + 1, e, l, r, w);
t[nd] = max(t[nd << 1], t[nd << 1 | 1]);
}
int ask(int nd, int s, int e, int l, int r) {
if (e < l or r < s) return 0;
int md = (s + e) >> 1;
if (s >= l and e <= r) return t[nd];
int c1 = ask(nd << 1, s, md, l, r);
int c2 = ask(nd << 1 | 1, md + 1, e, l, r);
return max(c1, c2);
}
void HLD(int u, int p, int w) {
if (head[chain] == -1) head[chain] = u;
belong[u] = chain;
pos[u] = ++n;
a[n] = w;
int nextv = -1, nextw = 0;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].first;
int w = g[u][i].second;
if (v == p) continue;
if (nextv == -1 or sub[nextv] < sub[v]) {
nextv = v, nextw = w;
}
}
if (~nextv) HLD(nextv, u, nextw);
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].first;
int w = g[u][i].second;
if (v == p or v == nextv) continue;
chain++;
HLD(v, u, w);
}
}
int query_up(int u, int v) {
if (u == v) return 0;
int uchain, vchain, res = 0;
while (1) {
uchain = belong[u], vchain = belong[v];
if (uchain == vchain) {
if (u == v) break;
umax(res, ask(1, 1, n, pos[v] + 1, pos[u]));
break;
}
umax(res, ask(1, 1, n, pos[head[uchain]], pos[u]));
u = Par[head[uchain]][0];
}
return res;
}
int query(int u, int v) {
int l = LCA(u, v);
return max(query_up(u, l), query_up(v, l));
}
int main() {
//freopen("input_A.txt", "r", stdin);
int tc = 1;
while (tc--) {
mem(head, -1);
n = 0, chain = 1;
for (int i = 0; i < N; i++) {
g[i].clear();
idx[i].clear();
}
int n, m; scanf("%d %d", &n, &m);
for (int i = 1; i < n; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u].push_back({v, w});
g[v].push_back({u, w});
idx[u].push_back(i - 1);
idx[v].push_back(i - 1);
}
dfs(1, 0);
HLD(1, 0, 0);
for (int i = 1; i <= n; i++) {
upd(1, 1, n, i, i, a[i]);
}
while (m--) {
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", query(u, v));
}
}
return 0;
}