#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define gc getchar
#define pc putchar
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
using namespace std;
const int N = 300010;
const int mod = 998244353; int T = 1;
void read() { return; } template <typename T, typename ...T2> void read(T &s, T2 &...oth) { s = 0; char ch = gc(); bool f = 0; for (; ch < '0' or ch > '9'; ch = gc()) if (ch == '-') f = 1; for (; ch >= '0' and ch <= '9'; ch = gc()) s = (s << 1) + (s << 3) + (ch ^ 48); s = f ? -s : s; read(oth...); return; }
void write(char ch) { return; } template <typename T, typename ...T2> void write(char ch, T s, T2 ...oth) { if (!s) { pc('0'); pc(ch); write(ch, oth...); return; } int stk[100], top = 0; if (s < 0) pc('-'), s = ~s + 1; while (s) stk[ ++ top] = s % 10, s /= 10; do pc(stk[top -- ] + (1 << 4) + (1 << 5)); while (top); pc(ch); write(ch, oth...); return; }
int qpow(int a, int b = mod - 2, int s = 1) { for (; b; b >>= 1, a = a * a % mod) if (b & 1) s = s * a % mod; return s; }
int fa[N][16], dep[N];
int n, m, cnt, s[N], val[N], d[N];
struct Paths { int u, v, w; }p[N];
vector<pair<int, int>> E[N];
inline void dfs(int u, int F) {
fa[u][0] = F; d[u] = d[F] + 1;
for (auto [v, w] : E[u]) if (v ^ F)
dep[v] = dep[u] + w, val[v] = w, dfs(v, u);
}
inline int lca(int u, int v) {
if (d[u] < d[v]) swap(u, v);
dep(i, 15, 0) if (d[fa[u][i]] >= d[v]) u = fa[u][i];
dep(i, 15, 0) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
return u == v ? u : fa[u][0];
}
inline void dfs(int u) {
for (auto [v, w] : E[u]) if (v ^ fa[u][0]) {
dfs(v); s[u] += s[v];
}
}
inline bool check(int mid) {
rep(i, 1, n) s[i] = 0; int c = 0, mx = 0;
rep(i, 1, m) {
if (p[i].w > mid) {
int u = p[i].u, v = p[i].v;
int F = lca(u, v); c ++ ;
s[u] ++ , s[v] ++ ; s[F] -= 2;
mx = max(mx, p[i].w);
}
} dfs(1);
rep(i, 1, n) if (s[i] == c)
if (mx - val[i] <= mid) return 1;
return 0;
}
int main() {
read(n, m);
rop(i, 1, n) {
int a, b, c; read(a, b, c);
E[a].push_back({b, c});
E[b].push_back({a, c});
} dfs(1, 0);
rep(j, 1, 15) rep(i, 1, n)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
rep(i, 1, m) {
int u, v; read(u, v); int F = lca(u, v);
p[i] = {u, v, dep[u] + dep[v] - dep[F] * 2};
}
int l = 0, r = 0;
rep(i, 1, m) r = max(r, p[i].w);
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
} printf("%d\n", l);
return 0;
}