#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <iomanip>
#define UNVISITED 999
#define VISITED 1
using namespace std;
class Edge
{
public:
int vertex,weight;
Edge(){ vertex =-1;weight=-1;}
Edge(int v,int w){ vertex =v; weight = w;}
};
class Graph
{
private:
int numVertex,numEdge;
int **matrix;
int *mark;
public:
Graph(int numVert)
{
int i,j;
numVertex=numVert;
numEdge=0;
mark=new int[numVert];
for(i=0;i<numVertex;i++)
{
mark[i]=UNVISITED;
}
matrix=(int**)new int*[numVertex];
for(i=0;i<numVertex;i++)
{
matrix[i]=new int[numVertex];
}
for(i=0;i<numVertex;i++)
{
for(int j=0;j<numVertex;j++)
{
matrix[i][j]=10000;
}
}
}
~Graph()
{
delete [] mark;
for(int i=0;i<numVertex;i++)
{
delete [] matrix[i];
}
delete[] matrix;
}
int n(){return numVertex;}
int e(){return numEdge;}
int first(int v)
{
int i;
for(i=0;i<numVertex;i++)
{
if(matrix[v][i]!=0)
{
return i;
}
}
return i;
}
int next(int v1,int v2)
{
int i;
for(i=v2+1;i<numVertex;i++)
{
if(matrix[v1][i]!=0)
{
return i;
}
}
return i;
}
void setEdge(int v1,int v2,int wgt)
{
if(matrix[v1][v2]==0)
{
numEdge++;
}
matrix[v1][v2]=wgt;
}
void delEdge(int v1,int v2)
{
if(matrix[v1][v2]!=0)
{
numEdge--;
}
matrix[v1][v2]=0;
}
int weight(int v1,int v2)
{
return matrix[v1][v2];
}
int getMark(int v)
{
return mark[v];
}
void setMark(int v,int val)
{
mark[v]=val;
}
};
int minVertex(Graph* G,int* D)
{
int i,v;
for(i=0;i<G->n();i++)
{
if(G->getMark(i)==UNVISITED)
{
v=i;break;
}
}
for(i++;i<G->n();i++)
{
if((G->getMark(i)==UNVISITED)&&(D[i]<D[v]))
{
v=i;
}
}
return v;
}
int Dijkstra(Graph* G,int *D,int * arr,int s,int C2)//可以通过数组地址的传递,在函数内可以对该数组进行访问和修改。
{
int i,v,w;
int sum=arr[s];
for(i=0;i<G->n();i++)
{
v = minVertex(G,D);
if(D[v]==10000)
{
return sum;
}
G->setMark(v,VISITED);
for(w=G->first(v);w<G->n();w=G->next(v,w))
{
if(D[w]>=(D[v]+G->weight(v,w)))
{
D[w]=D[v]+G->weight(v,w);
if(w==C2)
{
sum+=arr[v];
}
}
}
}
// return sum;
}
int main()
{
int N,M,C1,C2;
cin >> N >> M >> C1 >> C2;
Graph G(N);
int arr[N];//存放救援车数
for(int i=0;i<N;i++)
{
cin >> arr[i];
}
for(int j=0;j<M;j++)
{
int a,b,c;
cin >> a >> b >> c;
G.setEdge(a,b,c);
}
int D[N];
for(int i=0;i<N;i++)
{
D[i]=G.weight(C1,i);
}
int sum=Dijkstra(&G,D,arr,C1,C2);
cout << D[C2] << " " << sum+arr[C2];
return 0;
}