#include<cstdio>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1010;
const int INF=0x3fffffff;
int C, N, S, M;
int G[maxn][maxn], visit[maxn];
int weight[maxn], d[maxn];
vector<int>pre[maxn], tempPath, path;
int minNeed=INF, minRemain=INF;
void dijkstra(int s){
fill(d, d+maxn, INF);
d[s]=0;
for(int i=0; i<=N; i++){
int u=-1, MIN=INF;
for(int j=0; j<=N; j++){
if(MIN>d[j]&&visit[j]==0){
MIN=d[j];
u=j;
}
}
if(u==-1)break;
visit[u]=1;
for(int v=0; v<=N; v++){
if(visit[v]==0&&G[u][v]!=INF){
if(d[v]>d[u]+G[u][v]){
d[v]=d[u]+G[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(d[v]==d[u]+G[u][v]){
pre[v].push_back(u);
}
}
}
}
}
void dfs(int s){
if(s==0){
tempPath.push_back(s);
int remain=0, need=0;
for(int i=tempPath.size()-1; i>=0; i--){
int id=tempPath[i];
if(weight[id]>0){
remain+=weight[id];
}else{
if(remain>abs(weight[id])){
remain=remain-abs(weight[id]);
}else{
need+=abs(weight[id])-remain;
remain=0;
}
}
}
if(need<minNeed){
minNeed=need;
minRemain=remain;
path=tempPath;
}else if(need==minNeed&&remain<minRemain){
minRemain=remain;
path=tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(s);
for(int i=0; i<pre[s].size(); i++){
dfs(pre[s][i]);
}
tempPath.pop_back();
}
int main(){
int a, b, c;
scanf("%d%d%d%d", &C, &N, &S, &M);
fill(G[0], G[0]+maxn*maxn, INF);
for(int i=1; i<=N; i++){
scanf("%d", &weight[i]);
weight[i]=weight[i]-C/2;
}
for(int i=1; i<=M; i++){
scanf("%d%d%d", &a, &b, &c);
G[a][b]=G[b][a]=c;
}
dijkstra(0);
dfs(S);
printf("%d ", minNeed);
for(int i=path.size()-1; i>=0; i--){
printf("%d", path[i]);
if(i!=0)printf("->");
}
printf(" %d", minRemain);
return 0;
}