#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
int getin(){
char c=getchar();
int ans=0,f=1;
while(!isdigit(c)){
if(c=='-') f*=-1;
c=getchar();
}
while(isdigit(c)){
ans=(ans<<3)+(ans<<1)+(c^48);
c=getchar();
}
return ans*f;
}
void puto(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10)puto(x/10);
putchar('0'+x%10);
}
const int N=3e5+5;
struct node{
int next,to,dis;
}e[N<<1];
struct node2{
int u,v,lca,dis;
}a[N];
int h[N],cnt;
void add(int u,int v,int w){
e[++cnt]={h[u],v,w};
h[u]=cnt;
}
int n,m;
int g[N][30],lg[N],d[N],b[N],c[N],dis[N];
bool vis[N];
void dfs(int u,int fa){
g[u][0]=fa;
d[u]=d[fa]+1;
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
dis[v]=dis[u]+e[i].dis;
c[v]=e[i].dis;
dfs(v,u);
}
}
void dp(int u){
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v==g[u][0])continue;
dp(v);
b[u]+=b[v];
}
}
bool check(int x){
memset(b,0,sizeof(b));
int tot=0,maxn=0;
for(int i=1;i<=m;i++){
if(a[i].dis>x){
tot++;
b[a[i].u]++;b[a[i].v]++;
b[a[i].lca]-=2;
maxn=max(maxn,a[i].dis);
}
}
if(tot==0)return true;
dp(1);
for(int i=2;i<=n;i++)if(b[i]==tot&&maxn-c[i]<=x)return true;
return false;
}
int lca(int u,int v){
if(d[u]<d[v])swap(u,v);
for(int i=lg[d[u]];i>=0;i--) if(d[g[u][i]]>=d[v])u=g[u][i];
if(u==v)return u;
for(int i=lg[d[u]];i>=0;i--) if(g[u][i]!=g[v][i])u=g[u][i],v=g[v][i];
return g[u][0];
}
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dfs(1,0);
lg[0]=-1;
for(int i=1;i<=n;i++)lg[i]=lg[i>>1]+1;
for(int j=1;j<=lg[n];j++)
for(int i=1;i<=n;i++)g[i][j]=g[g[i][j-1]][j-1];
for(int i=1;i<=m;i++){
scanf("%d%d",&a[i].u,&a[i].v);
a[i].lca=lca(a[i].u,a[i].v);
a[i].dis=dis[a[i].u]+dis[a[i].v]-2*dis[a[i].lca];
}
int l=-1,r=1e9;
while(l+1<r){
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid;
}
cout<<r;
return 0;
}