#include <iostream>
using namespace std;
int G[500][500] = { 0 };//路消耗
int N[500] = { 0 };//每个城市的人数
int d[500] = { -1 };//到i的距离
int s[500] = { 0 };//到i最大救人数量
int p[500] = { 0 };//到i的最短路径数量
bool v[500] = { false };
int n, m, c1, c2;
void Dj(int c1, int c2) {
fill(d, d + 500, 100000000);
d[c1] = 0;
s[c1] = N[c1];
p[c1] = 1;
while (v[c2] == false) {
int u = -1, min = 1000000000;
for (int j = 0; j < n; j++) {
if (v[j] == false && d[j] < min) {
u = j;
min = d[j];
}
}
if (u == -1) return;
v[u] = true;
for (int j = 0; j < n; j++) {
if (v[j] == false && G[u][j] != 0) {
if (d[u] + G[u][j] < d[j]) {
d[j] = d[u] + G[u][j];
s[j] = s[u] + N[j];
p[j] = p[u];
}
else if (d[u] + G[u][j] == d[j]) {
s[j] = s[j] > s[u] + N[j] ? s[j] : s[u] + N[j];
p[j] += p[u];
}
}
}
}
cout << p[c2] << " " << s[c2];
}
int main() {
cin >> n >> m >> c1 >> c2;
for (int i = 0; i < n; i++)
cin >> N[i];
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
G[a][b] = G[b][a] = c;
}
Dj(c1, c2);
return 0;
}