#include #include #include #define rep(i,n) for(i=0;i<(int)(n);i++) #define NIL -1 using namespace std; typedef long long ll; typedef struct point{ int p; ll t; point(int pp=0,ll tt=0):p(pp),t(tt){} }Point; typedef struct data{ int p; ll t; bool tol; data(int pp=0,ll tt=0,bool ttol=false):p(pp),t(tt),tol(ttol){} bool operator<(const data& k)const{ return t > adj; vector tol; ll dijk(){ Data now,nxt; vector > visited(2,vector(n,false)); priority_queue PQ; PQ.push(Data(0,0,false)); if(tol[0]) PQ.push(Data(0,-s-1,true)); while(PQ.size()){ do{ now=PQ.top();PQ.pop(); }while(PQ.size()&&visited[now.tol][now.p]); if(visited[now.tol][now.p]) break; //printf("now:(%d,%lld,%d)\n",now.p,-now.t,now.tol?1:0); if(now.tol&&now.p==n-1) return -now.t; visited[now.tol][now.p]=true; for(Point x:adj[now.p]){ nxt.p=x.p; nxt.t=now.t-x.t; nxt.tol=now.tol; if(visited[nxt.tol][nxt.p]==false){ PQ.push(nxt); //printf("new:(%d,%lld,%d)\n",nxt.p,-nxt.t,nxt.tol?1:0); } if(nxt.tol==false&&tol[nxt.p]){ nxt.tol=true; if(s>-nxt.t){ nxt.t=-s-1; }else if(-nxt.t(n,false); adj=vector >(n); while(m--){ scanf("%d%d%d",&i,&j,&k); i--;j--; adj[i].push_back(Point(j,k)); adj[j].push_back(Point(i,k)); } while(l--){ scanf("%d",&i); i--; tol[i]=true; } printf("%lld\n",dijk()); return 0; }