#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
#include <string>
#include <queue>
using namespace std;
int Cmax,N,Sp,M;
int C[505];
int Road[505][505];
bool isReached[505];
int curLen = 0;
int minLen = 1<<30;
int curBike = 0;
int minBike = 1<<30;
int curSend = 0;
int minSend = 1<<30;
vector<int> curRoad;
vector<int> minRoad;
void dfs(int cur)
{
if(curLen>minLen)
return;
if(cur == Sp)
{
bool choosed = false;
if(curLen<minLen)
{
choosed = true;
}else if(curLen == minLen)
{
if(curSend<minSend)
{
choosed = true;
}else if(curSend == minSend)
{
if(curBike<minBike)
{
choosed = true;
}
}
}
if(choosed)
{
minLen = curLen;
minSend = curSend;
minBike = curBike;
minRoad = curRoad;
}
return;
}
for(int i=0;i<=N;i++)
{
if(!isReached[i] && Road[cur][i]>0)
{
isReached[i] = true;
curLen+= Road[cur][i];
int lastCurSend = curSend;
int lastCurBike = curBike;
if(C[i]+curBike<Cmax/2){
curSend += Cmax/2 - (C[i]+curBike);
curBike = 0;
}else{
curBike = C[i]+curBike-Cmax/2;
}
curRoad.push_back(i);
dfs(i);
curRoad.pop_back();
curSend = lastCurSend;
curBike = lastCurBike;
curLen-= Road[cur][i];
isReached[i] = false;
}
}
}
int main()
{
scanf("%d %d %d %d",&Cmax,&N,&Sp,&M);
for(int i=1;i<=N;i++)
{
scanf("%d",C+i);
}
for(int i=0;i<M;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
Road[a][b] = c;
Road[b][a] = c;
}
isReached[0] = true;
dfs(0);
printf("%d ",minSend);
printf("%d",0);
for(int i=0;i<minRoad.size();i++)
{
printf("->%d",minRoad[i]);
}
printf(" %d",minBike);
return 0;
}