#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N=10000000;
int cnt,head[N],a[N];
int n,m,qi,zong;
struct edge
{
int to,nx,w;
};
edge ed[N];
int dist[N],ww[N],vis[N];
int ne[N],lu[N];
struct nd{
int k,w;
bool operator<(const nd &qwe)const{
return w>qwe.w;//小到大
}
};
priority_queue<nd>qw;
void add(int a,int b,int w)
{
ed[++cnt].to=b;
ed[cnt].nx=head[a];
ed[cnt].w=w;
head[a]=cnt;
}
void dijk(){
memset(dist,0x3f,sizeof(dist));
dist[qi]=0,ww[qi]=a[qi];
qw.push({qi,0});
ne[qi]=-1;//路径
lu[qi]=1;
while(qw.size()){
auto t=qw.top();
qw.pop();
int dis=t.w,ver=t.k,di=ww[ver];//距离,点,人数
if(vis[ver]) continue;
vis[ver]=true;
for(int i=head[ver];i!=-1;i=ed[i].nx){
int j=ed[i].to;
int w=ed[i].w;
int ren=a[j];
if(dist[j]==dis+w){
lu[j]+=lu[ver];//路径数量更新
}else if(dist[j]>dis+w){
lu[j]=lu[ver];
}
if(dist[j]>dis+w){
dist[j]=dis+w;
ww[j]=di+ren;
ne[j]=ver;
qw.push({j,dist[j]});
}else if(dist[j]==dis+w&&ww[j]<di+ren){
ne[j]=ver;//路径
ww[j]=di+ren;
qw.push({j,dist[j]});
}
}
}
}
void solve()
{ cin>>n>>m>>qi>>zong; qi++,zong++;
for(int i=1;i<=n;i++) {cin>>a[i];}
for(int i=1;i<=n;i++) {head[i]=-1;}
for(int i=1;i<=m;i++){
int z,y,w;
cin>>z>>y>>w;
z++,y++;
add(z,y,w);
add(y,z,w);
}
dijk();
cout<<lu[zong]<<" "<<ww[zong]<<endl;
stack<int>q;
while(zong!=-1){
q.push(zong-1);
zong=ne[zong];
}
while(q.size()){
cout<<q.top();
q.pop();
if(q.size() ) cout<<" ";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}