#include<bits/stdc++.h>
#include "crocodile.h"
using namespace std;
using ll = long long;
const int n=1e5;
const ll inf=1e18;
pair<ll,ll> dp[n];
vector<pair<int,int>>graph[n];
ll dfs(int u,int p){
ll cur;
pair<ll,ll>mn={inf,inf};
for(auto&i:graph[u])if(i.first!=p){
cur=dfs(i.first,u)+i.second;
if(mn.first>=cur){
mn.second=mn.first;
mn.first=cur;
}
else if(mn.second>=cur)mn.second=cur;
}
if(mn.second==inf)mn.second=0;
return mn.second;
}
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[])
{
for(int i=0;i<N;++i)
dp[i]={inf,inf};
int u,v;
for(int i=0;i<M;++i){
u=R[i][0];v=R[i][1];
graph[u].push_back({v,L[i]});
graph[v].push_back({u,L[i]});
}
priority_queue<pair<int,ll>,vector<pair<int,ll>>,greater<>>q;
for(int i=0;i<K;++i){
u=P[i];
dp[u]={0,0};
q.push({u,0});
}
ll w;
while(!q.empty()){
u=q.top().first;
w=q.top().second;
q.pop();
if(dp[u].second!=w)continue;
for(auto&i:graph[u]){
v=i.first;
bool ok=0;
if(dp[v].first>=w+i.second){
dp[v].second=dp[v].first;
dp[v].first=w+i.second;
ok=1;
}
else if(dp[v].second>w+i.second){
dp[v].second=w+i.second;
ok=1;
}
if(ok and dp[v].second!=inf)q.push({v,dp[v].second});
}
}
assert(dp[0].second>=dfs(0,0));
return dp[0].second;
}