#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int inf = 1000000;
const int maxn = 510;
int N, M, c1, c2;
int cost[maxn][maxn], team[maxn];
int used[maxn], dis[maxn];
int road[maxn], gather[maxn];
void init(){
fill(cost[0], cost[0] + maxn * maxn, inf);
fill(dis, dis + maxn, inf);
memset(road, 0, sizeof(road));
memset(gather, 0, sizeof(gather));
}
void dijkstra(){
dis[c1] = 0;
road[c1] = 1;
gather[c1] = team[c1];
for(int i = 0; i < N; i++){
int u = -1, Min = inf;
for(int v = 0; v < N; v++){
if(used[v] == 0 && dis[v] < Min){
Min = dis[v]; u = v;
}
}
if(u == -1) break;
used[u] = 1;
for(int v = 0; v < N; v++){
if(used[v] == 0 && cost[u][v] != inf){
if(dis[v] > dis[u] + cost[u][v]){
dis[v] = dis[u] + cost[u][v];
road[v] = road[u];
gather[v] = gather[u] + team[v];
}else if(dis[v] == dis[u] + cost[u][v]){
road[v] += road[u];
gather[v] = max(gather[v], gather[u] + team[v]);
}
}
}
if(u == c2) break;
}
printf("%d %d\n", road[c2], gather[c2]);
}
int main(){
init();
scanf("%d %d %d %d", &N, &M, &c1, &c2);
for(int i = 0; i < N; i++){
scanf("%d", &team[i]);
}
int x, y, w;
for(int i = 0; i < M; i++){
scanf("%d %d %d", &x, &y, &w);
cost[x][y] = cost[y][x] = w;
}
dijkstra();
return 0;
}