#include #define int long long using namespace std; const int N=200010; const int INF=0x3f3f3f3f3f3f3f3f; int n,m,l; int t[N]; int ddis[N]; vector >G[N]; struct Node{ int u,dis; Node(int u,int dis):u(u),dis(dis){}; friend bool operator < (Node a,Node b){ return a.dis>b.dis; } }; int dis[N],vis[N]; void Dijkstra(int s){ for(int i=1;i<=n;i++)dis[i]=INF,vis[i]=0; priority_queueq; dis[s]=0; q.push(Node(s,dis[s])); while(!q.empty()){ int u=q.top().u; q.pop(); if(vis[u])continue; vis[u]=1; for(auto E:G[u]){ int v=E.first,w=E.second; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; q.push(Node(v,dis[v])); } } } return; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>l; for(int i=1;i<=n;i++)cin>>t[i]; for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; G[u].push_back(make_pair(v,w)); G[v].push_back(make_pair(u,w)); } Dijkstra(l); for(int i=1;i<=n;i++)ddis[i]=dis[i]; int cnt=0; for(int i=1;i<=n;i++)cnt+=(t[i]>0); if(cnt==1){ cout<<"0\n"; return 0; } int ans=INF; for(int i=1;i<=n;i++){ Dijkstra(i); int s=0; if(t[l]){ for(int j=1;j<=n;j++)s+=dis[j]*t[j]*2; s-=dis[l]; ans=min(ans,s); } else{ for(int j=1;j<=n;j++)s+=dis[j]*t[j]*2; for(int j=1;j<=n;j++){ if(!t[j])continue; ans=min(ans,s-dis[j]+ddis[j]); } } } cout<