#include<cstdio>
#include<vector>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
const int maxv = 510;
const int inf = 1000000000;
struct node{
int v,dis;
node(int _v,int _dis) : v(_v),dis(_dis) {}
};
vector<node> adj[maxv];
int n,m,st,ed,weight[maxv];
int d[maxv],w[maxv],num[maxv];
set<int> pre[maxv];
void bellman(int s){
fill(d,d+maxv,inf);
memset(num,0,sizeof(num));
memset(w,0,sizeof(w));
d[s] = 0;
w[s] = weight[s];
num[s] = 1;
for(int i=0;i<n-1;i++){
for(int u=0;u<n;u++){
for(int j=0;j<adj[u].size();j++){
int v = adj[u][j].v;
int dis=adj[u][j].dis;
if(d[u]+dis<d[v]){
d[v] = d[u] + dis;
w[v] = w[u] + weight[v];
num[v] = num[u];
pre[v].clear();
pre[v].insert(u);
}else if(d[u]+dis==d[v]){
if(w[u]+weight[v]>w[v]){
w[v] = w[u] + weight[v];
}
pre[v].insert(u);
num[v] = 0;
set<int>::iterator it;
for(it=pre[v].begin();it!=pre[v].end();it++){
num[v] += num[*it];
}
}
}
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&st,&ed);
for(int i=0;i<n;i++){
scanf("%d",&weight[i]);
}
int u,v,wt;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&wt);
adj[u].push_back(node(v,wt));
adj[v].push_back(node(u,wt));
}
bellman(st);
printf("%d %d\n",num[ed],w[ed]);
return 0;
return 0;
}
const int maxv = 510;
const int inf = 1000000000;
int n,d[maxv],num[maxv];
bool inq[maxv];
bool spfa(int s){
memset(inq,false,sizeof(inq));
memset(num,0,sizeof(num));
fill(d,d+maxv,inf);
queue<int> q;
q.push(s);
inq[s] = true;
num[s]++;
d[s]=0;
while(!q.empty()){
int u = q.front();
q.pop();
inq[u] = false;
for(int j=0;j<adj[u].size();j++){
int v = adj[u][j].v;
int dis=adj[u][j].dis;
if(d[u]+dis<d[v]){
d[v] = d[u] + dis;
if(!inq[v]){
q.push(v);
inq[v] = true;
num[v]++;
if(num[v]>=n) return false;
}
}
}
}
return true;
}