#include using namespace std; //#define LOCAL template struct Edge{ int s,t; T c; Edge(int x,T y):s(-1),t(x),c(y){} Edge(int x,int y,T z):s(x),t(y),c(z){} }; template using Edges=vector >; template using Graph=vector >; template vectorDijkstra(int s,Graph&g){ const T INF=numeric_limits::max(); int n=g.size(); vector d(n,INF); vectorpr(n,-1); priority_queue,vector >,greater > >pq; d[s]=0; pq.emplace(d[s],s); while(!pq.empty()){ T c=pq.top().first; int v=pq.top().second; pq.pop(); if(d[v]c+l){ d[u]=c+l; pr[u]=v; pq.emplace(d[u],u); } } } return d; } using ll=long long; #define rng(i,l,r) for(int i=int(l);i=int(l);i--) #define rrep(i,r) rrng(i,0,r) #define pb push_back #define eb emplace_back #define mp make_pair #define mt make_tuple #define one(x) memset(x,-1,sizeof(x)) #define zero(x) memset(x,0,sizeof(x)) #define F first #define S second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #define si(x) int(x.size()) #define inf INT_MAX/2-100 #define infl LLONG_MAX/3 #ifdef LOCAL #define dmp(x) cerr<<__LINE__<<' '<<#x<<' '<void chmax(t&a,u b){if(avoid chmin(t&a,u b){if(busing vc=vector; templateusing vvc=vector>; using pi=pair; using pl=pair; using vi=vc; using vl=vc; ll readl(void){ ll x; cin>>x; return x; } int readi(void){ int x; cin>>x; return x; } string readstr(){ string s; cin>>s; return s; } vi readvi(int n,int off=0){ vi v(n); rep(i,n)v[i]=readi(),v[i]+=off; return v; } vl readvl(int n,int off=0){ vl v(n); rep(i,n)v[i]=readl(),v[i]+=off; return v; } template void print(t x,int suc=1){ cout< void print(const vc&v,int suc=1){ rep(i,si(v))print(v[i],i==int(si(v))-1?1:suc); } template bool inc(t a,t b,t c){ return !(c void compress(vc&v){ sort(all(v)); v.erase(unique(all(v)),v.ed); } template int lwb(const vc&v,const t&a){ return lower_bound(all(v),a)-v.bg; } template struct Compress{ vcv; Compress()=default; Compress(const vc&x){ add(x); } Compress(const initializer_list >&x){ for(auto &p:x)add(p); } void add(const t&x){ v.eb(x); } void add(const vc&x){ copy(all(x),back_inserter(v)); } void build(){ compress(v); } int get(const t&x)const{ return lwb(v,x); } vcget(const vc&x)const{ vcres(x); for(auto &p:res)p=get(p); return res; } const t &operator[](int x)const{ return v[x]; } }; void Yes(bool ex=true){ cout<<"Yes\n"; if(ex)exit(0); } void YES(bool ex=true){ cout<<"YES\n"; if(ex)exit(0); } void No(bool ex=true){ cout<<"No\n"; if(ex)exit(0); } void NO(bool ex=true){ cout<<"NO\n"; if(ex)exit(0); } void orYes(bool x,bool ex=true){ if(x)Yes(ex); else No(ex); } void orYES(bool x,bool ex=true){ if(x)YES(ex); else NO(ex); } void Possible(bool ex=true){ cout<<"Possible\n"; if(ex)exit(0); } void POSSIBLE(bool ex=true){ cout<<"POSSIBLE\n"; if(ex)exit(0); } void Impossible(bool ex=true){ cout<<"Impossible\n"; if(ex)exit(0); } void IMPOSSIBLE(bool ex=true){ cout<<"IMPOSSIBLE\n"; if(ex)exit(0); } void orPossible(bool x,bool ex=true){ if(x)Possible(ex); else Impossible(ex); } void orPOSSIBLE(bool x,bool ex=true){ if(x)POSSIBLE(ex); else IMPOSSIBLE(ex); } int main(void){ cin.tie(0); ios::sync_with_stdio(0); ll n=readl(),m=readl(),l=readl()-1; vl t=readvl(n); for(auto &i:t)dmp(i); Graph g(n); rep(i,m){ ll a=readl(),b=readl(),c=readl(); a--,b--; g[a].eb(b,c); g[b].eb(a,c); } vl dis=Dijkstra(l,g); ll ans=infl; rep(i,n){ dmp(i); ll r=infl,s=0; vl d=Dijkstra(i,g); rep(j,n){ dmp(d[j]); s+=t[j]*d[j]*2LL; if(t[j])chmin(r,dis[j]-d[j]); } chmin(ans,s+r); dmp(s+r); } print(ans); }