/*
调试了大半天终于过了这个题,呜呜呜
基本把dijkstra的拓展用了一遍
qq: 54573339
2019/11/27
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 510;
int n,m;
int dist[N];
int pre[N];
bool st[N];
int nums[N];
int weights[N];
int g[N][N];
int w[N];
int start,en;
void Dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[start] = 0;
w[start] = weights[start];
for(int i = 0;i <= n;i++)
{
pre[i] = i;
}
nums[start] = 1;
for(int i = 0;i < n;i++)
{
int t = -1;
for(int j = 0;j < n;j++)
{
if(!st[j]&&(t==-1||dist[t]>dist[j]))t = j;
}
if(t==-1)return;
st[t] = true;
for(int v = 0;v < n;v++)
{
if(dist[v] > dist[t] + g[t][v])
{
dist[v] = dist[t] + g[t][v];
nums[v] = nums[t];
w[v] = w[t] + weights[v];
pre[v] = t;
}
else if(dist[v] == dist[t] + g[t][v])
{
nums[v] = nums[t] + nums[v];
if(w[t] + weights[v] > w[v])
{
pre[v] = t;
w[v] = w[t] + weights[v];
}
}
}
}
}
vector<int>road;
void dfs(int e)
{
if(e==start){
road.push_back(e);return ;
}
dfs(pre[e]);
road.push_back(e);
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m >> start >> en;
memset(g,0x3f,sizeof g);
for(int i = 0;i < n;i++)
{
cin >> weights[i];
}
for(int i = 0;i < m;i++)
{
int a,b,c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = min(g[a][b],c);
}
Dijkstra();
cout << nums[en] << " " << w[en] << endl;
bool tf = false;
dfs(en);
for(auto &x : road)
{
if(tf)cout << " ";
cout << x;
tf = true;
}
return 0;
}