#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; struct edge{int to,cost;}; typedef pair P; typedef pair PP; vector > G; int main() { int n; cin>>n; G.resize(n); vector stay(n); for(int i=0;i>stay[i]; int m; cin>>m; for(int i=0;i>a>>b>>c; G[a].push_back(edge{b,c}); G[b].push_back(edge{a,c}); } //d[今の地点][これまで何回泊まったか]=費用 vector > d(n,vector(3,1000000)); priority_queue,greater > q; d[0][0]=0; q.push(PP(0,P(0,0))); vector stayed(n,false); while(!q.empty()){ PP pp=q.top(); q.pop(); int now=pp.second.first; int cnt=pp.second.second; if(pp.first>d[now][cnt]) continue; for(int i=0;id[now][cnt]+cost){ d[to][cnt]=d[now][cnt]+cost; q.push(PP(d[to][cnt],P(to,cnt))); } } if(cnt<2 && !stayed[now] && now!=0 && now!=n-1 && d[now][cnt+1]>d[now][cnt]+stay[now]){ stayed[now]=true; d[now][cnt+1]=d[now][cnt]+stay[now]; q.push(PP(d[now][cnt+1],P(now,cnt+1))); } } cout<