#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=510;
const int inf=1000000000;
int n,m,G[maxn][maxn],weight[maxn];
int d[maxn],num[maxn],w[maxn];
bool vis[maxn]={false};
void Dijkstra(int s){
fill(d,d+maxn,inf);
memset(num,0,sizeof(num));
memset(w,0,sizeof(w));
d[s]=0;
num[s]=1;
w[s]=weight[s];
for(int i=0;i<n;i++){
int u=-1,min=inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return ;
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=inf){
if(d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
w[v]=w[u]+weight[v];
num[v]=num[u];
}
else if(d[u]+G[u][v]==d[v]){
// 这里不加 else 就错了
//注意每次这两个情况只能出现一次,是互斥事件
num[v]+=num[u];
if(w[u]+weight[v]>w[v]){
w[v]=w[u]+weight[v];
}
}
}
}
}
}
int main(){
int st,ed,u,v;
scanf("%d%d%d%d",&n,&m,&st,&ed);
for(int i=0;i<n;i++){
scanf("%d",&weight[i]);
}
fill(G[0],G[0]+maxn*maxn,inf);
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
scanf("%d",&G[u][v]);
G[v][u]=G[u][v];
}
Dijkstra(st);
printf("%d %d\n",num[ed],w[ed]);
}