#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#define MAX 500
#define INF 99999
using namespace std;
int sumLength, minLength, sumTeam, maxTeam, sumCount;
struct Graph {
int cityNumber;
int roadNumber;
int rescueTeam[MAX];
int road[MAX][MAX];
bool visit[MAX];
};
void InitialGraph(Graph &graph,int &start, int &goal);
void dfs(Graph &graph, int start, int goal);
int main() {
freopen("D://input.txt", "r", stdin);
Graph graph;
int start, goal;
InitialGraph(graph, start, goal);
minLength = INF, sumLength = 0, sumCount = 0;
maxTeam = sumTeam = graph.rescueTeam[start];
graph.visit[start] = true;
dfs(graph, start, goal);
cout << sumCount << " " << maxTeam << endl;
return 0;
}
void InitialGraph(Graph &graph, int &start, int &goal) {
int i, j;
cin >> graph.cityNumber >> graph.roadNumber >> start >> goal;
for (i = 0; i < graph.cityNumber; i++) {
cin >> graph.rescueTeam[i];
graph.visit[i] = false;
}
for (i = 0; i < graph.cityNumber; i++)
for (j = 0; j < graph.cityNumber; j++)
graph.road[i][j] = INF;
for (i = 0; i < graph.roadNumber; i++) {
int c1, c2, l;
cin >> c1 >> c2 >> l;
graph.road[c1][c2] = graph.road[c2][c1] = l;
}
return;
}
void dfs(Graph &graph, int start, int goal) {
int i;
if (sumLength > minLength)
return;
if (start == goal) {
if (sumLength < minLength) {
minLength = sumLength;
maxTeam = sumTeam;
sumCount = 1;
}
else if (sumLength == minLength) {
if (sumTeam > maxTeam)
maxTeam = sumTeam;
sumCount++;
}
return;
}
for (i = 0; i < graph.cityNumber; i++) {
if (!graph.visit[i]&&graph.road[start][i]<INF) {
graph.visit[i] = true;
sumLength += graph.road[start][i];
sumTeam += graph.rescueTeam[i];
dfs(graph, i, goal);
graph.visit[i] = false;
sumLength -= graph.road[start][i];
sumTeam -= graph.rescueTeam[i];
}
}
return;
}