#include<iostream>
#include<cstring>
using namespace std;
const int inf=1000000000;
int N,M,C1,C2,e[510][510],weight[510],num[510],w[510],d[510];
bool vis[510];
void dijkstra(int start){
memset(vis,false,sizeof(vis));
fill(d,d+510,inf);
d[start]=0;
num[start]=1;
w[start]=weight[start];
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];
w[v]=w[u]+weight[v];
num[v]=num[u];
}else if(d[v]==d[u]+e[u][v]){
num[v]+=num[u];
if(w[v]<w[u]+weight[v])
w[v]=w[u]+weight[v];
}
}
}
}
}
int main(){
int a,b,t;
scanf("%d%d%d%d",&N,&M,&C1,&C2);
fill(e[0],e[0]+510*510,inf);
for(int i=0;i<N;i++)
scanf("%d",&weight[i]);
for(int i=0;i<M;i++){
cin>>a>>b>>t;
e[a][b]=e[b][a]=t;
}
dijkstra(C1);
printf("%d %d\n",num[C2],w[C2]);
}