#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 1;
const int maxm = maxn * 2;
int n,m,x,y,z,num,tmp,tot1,tot2,res,maxx;
int head[maxn],edge[maxm],nxt[maxm],w[maxn];
int headq[maxn],edgeq[maxm],nxtq[maxm],wq[maxm];
int siz[maxn],dis[maxn],fa[maxn],len[maxn];
bool st[maxn];
struct node{
int u,v;
int lca,len;
}g[maxn];
static inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
static inline void add(int x,int y,int z){
edge[++tot1] = y;
w[tot1] = z;
nxt[tot1] = head[x];
head[x] = tot1;
}
static inline void add_que(int x,int y){
edgeq[++tot2] = y;
nxtq[tot2] = headq[x];
headq[x] = tot2;
}
static inline int find(int x){
if(fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
static inline void join(int x,int y){
int p1 = find(x);
int p2 = find(y);
if(p1 != p2) fa[p1] = find(p2);
}
static inline void dfs(int now,int father){
for(register int i=head[now];i;i=nxt[i]){
int j = edge[i];
if(j == father) continue;
dfs(j,now);
siz[now] += siz[j];
}
if(siz[now] == num && len[now] > tmp) tmp = len[now];
}
static inline bool check(int x){
memset(siz,0,sizeof(siz));
num = tmp = 0;
for(register int i=1;i<=m;i++){
if(g[i].len > x){
siz[g[i].u]++,siz[g[i].v]++;
siz[g[i].lca] -= 2;
num++;
}
}
dfs(1,0);
return (maxx - tmp <= x);
}
static inline void tarjan(int now,int father){
for(register int i=head[now];i;i=nxt[i]){
int j = edge[i];
if(j == father) continue;
dis[j] = dis[now] + w[i];
tarjan(j,now);
len[j] = w[i];
join(j,now);
st[j] = true;
}
for(register int i=headq[now];i;i=nxtq[i]){
int j = edgeq[i];
if(!st[j]) continue;
int t = (i + 1) / 2;
g[t].lca = find(j);
g[t].len = dis[now] + dis[j] - 2 * dis[g[t].lca];
maxx = max(maxx,g[t].len);
}
}
static inline void binary_search(){
int left = 0;
int right = maxx;
while(left <= right){
int mid = (left + right) / 2;
if(check(mid)) right = mid - 1,res = mid;
else left = mid + 1;
}
}
int main(){
n = read(),m = read();
for(register int i=1;i<=n;i++) fa[i] = i;
for(register int i=1;i<n;i++){
x = read(),y = read(),z = read();
add(x,y,z),add(y,x,z);
}
for(register int i=1;i<=m;i++){
x = read(),y = read();
g[i].u = x,g[i].v = y;
add_que(x,y),add_que(y,x);
}
tarjan(1,0);
binary_search();
printf("%d\n",res);
return 0;
}