#include using namespace std; typedef long long int ll; typedef pair P; typedef vector VI; typedef vector VVI; #define REP(i,n) for(int i=0;i another.d;}; }; int n, q, c; vector G[4000]; vector d(4000, INF); vector bd(4000, INF); void dijkstra(int s, bool f){ priority_queue que; if(f){ REP(i,n){ que.push(qu{bd[i]+c,i}); d[i]=bd[i]+c; } que.push(qu{bd[n],s}); d[s]=bd[n]; } else{ REP(i,n){ d[i]=INF; } que.push(qu{0,s}); d[s]=0; } while(!que.empty()){ qu p=que.top(); que.pop(); int v=p.v; if(d[v]d[v]+e.cost){ d[e.to]=d[v]+e.cost; que.push(qu{d[e.to],e.to}); } } } } int main(){ cin >> n >> q >> c; int u, v, l; REP(i,n-1){ cin >> u >> v >> l; u--, v--; G[u].push_back({v,l}); G[v].push_back({u,l}); } int x, pre; cin >> pre; pre--; vector bdt(n,0); bd[n]=0; REP(i,q-1){ cin >> x; x--; dijkstra(pre,1); REP(i,n) bdt[i]=d[i]; ll bdn=d[x]; dijkstra(x,0); REP(i,n) bd[i]=min(bd[i]+d[pre],bdt[i]+d[i]); bd[n]=bdn; pre=x; } cout << bd[n] << endl; return 0; }