#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<stack>
using namespace std;
#define INF 100000000
#define min(a,b) a<b?a:b
struct djst{
int index;
int length;
};
void Dijkstra(vector<djst> a[],int c1,int c2,int n,int c[])
{
int path[500];
int dist[500];
int visit[500]={0};
stack<int> q;
int save[500];
for(int i=0;i<n;i++)
{
dist[i]=INF;
save[i]=c[i];
}
for(int i=0;i<a[c1].size();i++)
dist[a[c1][i].index]=a[c1][i].length;
q.push(c1);
int t;
int j=0;
int past=dist[c2];
dist[c1]=0;
save[c1]=c[c1];
int way=0;
int min1=INF;
int max1=0;
int pre=0;
while(!q.empty())
{
t=q.top();
q.pop();
if(!q.empty()&&q.top()==-1)//当把一个点的相连路径都遍历过时将其变为可用
{
if(t!=c1)
visit[t]=0;
q.pop();
continue;
}
if(t!=c2)
{visit[t]=1;
}
else if(t==c2)
{
if(dist[c2]<min1)
{
min1=dist[c2];
way=1;
max1=save[c2];
}
else if(dist[c2]==min1&&dist[c2]!=INF)
{
way++;
if(save[c2]>max1)
max1=save[c2];
}
if(!q.empty())
{
dist[c2]=past;
save[c2]=c[c2];
visit[c1]=1;
}
continue;
}
for(int i=0;i<a[t].size();i++)
{
if(i==0&&t!=c1)
{
q.push(-1);
q.push(t);
}
if(dist[t]+a[t][i].length<dist[a[t][i].index]&&!visit[a[t][i].index])
{
dist[a[t][i].index]=dist[t]+a[t][i].length;
save[a[t][i].index]=save[t]+c[a[t][i].index];
q.push(a[t][i].index);
}
else if(dist[t]+a[t][i].length==dist[a[t][i].index]&&!visit[a[t][i].index])
{
if(c[a[t][i].index]+save[t]>save[a[t][i].index])
save[a[t][i].index]=c[a[t][i].index]+save[t];
q.push(a[t][i].index);
}
}
}
printf("%d %d\n",way,max1);
}
int main()
{
vector<djst> a[500];
struct djst ex;
int c[500];
int n,m,c1,c2;
int x,y,l;
scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&l);
ex.index=y;
ex.length=l;
a[x].push_back(ex);
ex.index=x;
ex.length=l;
a[y].push_back(ex);
}
Dijkstra(a,c1,c2,n,c);
return 0;
}