#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
#define INF 99999999
#define M 700
int dis[M][M],cost[M][M];
int d[M],c[M],vis[M];
int cityr[M],passr[M],passn[M],city[M];
void disdj(int n,int s,int e)
{
int i,j,select,dmin,rmax;
int pn;
memset(vis,0,sizeof(vis));
for(i = 0;i < n; i++)
{
d[i] = INF;
}
d[s] = 0;
passn[s] = 1;
passr[s] = city[s];
for(i = 0;i < n;i++)
{
select = -1;
dmin = INF;
for(j = 0;j < n;j++)
{
if(vis[j])
continue;
if(d[j] < dmin )
{
dmin = d[j];
select = j;
}
}
if(select == -1 || select == e)
break;
vis[select] = 1;
for(j = 0;j < n; j++)
{
if(vis[j])
continue;
if(d[select] + dis[select][j] < d[j])
{
d[j] = d[select] + dis[select][j];
passn[j] = passn[select];
passr[j] = passr[select] + city[j];
}
else if(d[select] + dis[select][j] == d[j] )
{
passn[j] += passn[select] ;
if(passr[j] < passr[select] + city[j])
{
passr[j] = passr[select] + city[j];
}
}
}
}
printf("%d %d\n",passn[e],passr[e]);
}
int main(){
int n,m,s,e;
scanf("%d%d%d%d",&n,&m,&s,&e);
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
dis[i][j]=0;
else
dis[i][j]=INF;
}
for(i = 0;i<n;i++)
{
scanf("%d",&city[i]);
}
int re,rs,rl;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&rs,&re,&rl);
dis[rs][re]=dis[re][rs]=rl;
}
disdj(n,s,e);
return 0;
}