#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
struct edge{//对此算法统计最短路径条数,和最大点权不太清楚
int end,weight;
};
struct node{
int id;
int pop;
vector<edge> bian;
};
int pathnum[maxn]={0};
set<int> pre[maxn];
int city;
int w[maxn]={0};
vector<node> ad;
bool inq[maxn]={false};//记录是否在队列中
int d[maxn];//记录最短路径
int num[maxn]={0};//记录入队次数
bool SPFA(int s,int c){
fill(d,d+city,INF);
d[s]=0;
w[s]=ad[s].pop;
queue<node> q;
pathnum[s]=1;
q.push(ad[s]);
inq[s]=true;
num[s]++;
while(!q.empty())
{
node qw;
qw=q.front();
q.pop();
int id;
id=qw.id;
inq[id]=false;
for(int i=0;i<qw.bian.size();i++)
{ int z;
z=d[id]+qw.bian[i].weight;
int k;
k=d[qw.bian[i].end];
int r=qw.bian[i].end;
if(k>z){
d[qw.bian[i].end]=z;
if(!inq[qw.bian[i].end]) {
q.push(ad[qw.bian[i].end]);
inq[qw.bian[i].end]=true;
num[qw.bian[i].end]++;
if(num[qw.bian[i].end]>=c) return false;
}
}
}
for(int i=0;i<c;i++)
cout<<d[i]<<",";
cout<<endl;
}
return true;
int end,weight;
};
struct node{
int id;
int pop;
vector<edge> bian;
};
int pathnum[maxn]={0};
set<int> pre[maxn];
int city;
int w[maxn]={0};
vector<node> ad;
bool inq[maxn]={false};//记录是否在队列中
int d[maxn];//记录最短路径
int num[maxn]={0};//记录入队次数
bool SPFA(int s,int c){
fill(d,d+city,INF);
d[s]=0;
w[s]=ad[s].pop;
queue<node> q;
pathnum[s]=1;
q.push(ad[s]);
inq[s]=true;
num[s]++;
while(!q.empty())
{
node qw;
qw=q.front();
q.pop();
int id;
id=qw.id;
inq[id]=false;
for(int i=0;i<qw.bian.size();i++)
{ int z;
z=d[id]+qw.bian[i].weight;
int k;
k=d[qw.bian[i].end];
int r=qw.bian[i].end;
if(k>z){
d[qw.bian[i].end]=z;
if(!inq[qw.bian[i].end]) {
q.push(ad[qw.bian[i].end]);
inq[qw.bian[i].end]=true;
num[qw.bian[i].end]++;
if(num[qw.bian[i].end]>=c) return false;
}
}
}
for(int i=0;i<c;i++)
cout<<d[i]<<",";
cout<<endl;
}
return true;
}
int main(){
int c1,c2,ednum;
cin>>city>>ednum>>c1>>c2;
int pop;
for(int i=0;i<city;i++)
{
node temp;
temp.id=i;
cin>>pop;
temp.pop = pop;
ad.push_back(temp);
}
for (int i = 0; i <ednum; i++)
{
int start, end, weight;
cin >> start >> end >> weight;
edge qw;
qw.end = end; qw.weight = weight;
ad[start].bian.push_back(qw);
qw.end=start;
ad[end].bian.push_back(qw);
}
SPFA(c1,city);
cout<<d[c2];
return 0;
}
int main(){
int c1,c2,ednum;
cin>>city>>ednum>>c1>>c2;
int pop;
for(int i=0;i<city;i++)
{
node temp;
temp.id=i;
cin>>pop;
temp.pop = pop;
ad.push_back(temp);
}
for (int i = 0; i <ednum; i++)
{
int start, end, weight;
cin >> start >> end >> weight;
edge qw;
qw.end = end; qw.weight = weight;
ad[start].bian.push_back(qw);
qw.end=start;
ad[end].bian.push_back(qw);
}
SPFA(c1,city);
cout<<d[c2];
return 0;
}