#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
int const inf=1000000000;
int Cmax,N,Sp,M,e[510][510],d[510],weight[510],minSend=inf,minBack=inf;
bool vis[510];
vector<int> pre[510],tempPath,path;
void dfs(int v){
tempPath.push_back(v);
if(v==0){
int send=0,back=0;
for(int i=tempPath.size()-1;i>=0;i--){
int id=tempPath[i];//别忘了
if(weight[id]>0){//back
back+=weight[id];
}else {//send
if(abs(weight[id])<back){//够
back+=weight[id];
}else{//不够
send+=abs(weight[id])-back;
back=0;
}
}
}
if(minSend>send){
minSend=send;
minBack=back;
path=tempPath;
}else if(minSend==send&&minBack>back){
minBack=back;
path=tempPath;
}
tempPath.pop_back();
return;
}
for(int i=0;i<pre[v].size();i++)
dfs(pre[v][i]);
tempPath.pop_back();
}
void dijkstra(int start){
fill(d,d+510,inf);
memset(vis,false,sizeof(vis));
d[start]=0;
for(int i=0;i<=N;i++){
int u=-1,minn=inf;
for(int j=0;j<=N;j++){
if(vis[j]==false&&d[j]<minn){
u=j;
minn=d[j];
}
}
if(u==-1) break;
vis[u]=true;
for(int v=0;v<=N;v++){
if(vis[v]==false&&e[u][v]!=inf){
if(d[v]>d[u]+e[u][v]){
d[v]=d[u]+e[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(d[v]==d[u]+e[u][v])
pre[v].push_back(u);
}
}
}
}
int main(){
int a,b,t;
fill(e[0],e[0]+510*510,inf);
scanf("%d%d%d%d",&Cmax,&N,&Sp,&M);
for(int i=1;i<=N;i++){
scanf("%d",&weight[i]);
weight[i]-=Cmax/2;
}
for(int i=0;i<M;i++){
scanf("%d%d%d",&a,&b,&t);
e[a][b]=e[b][a]=t;
}
dijkstra(0);
dfs(Sp);
printf("%d 0",minSend);
for(int i=path.size()-2;i>=0;i--)
printf("->%d",path[i]);
printf(" %d",minBack);
}