#include<stdio.h> #include<vector> #include<string.h> using namespace std; #define mx 505 struct edge { int c; int len; }; vector<edge> E[mx]; int city[mx]; int dis[mx]; int visited[mx]; int ccnt[mx];//the number of different shortest path int csave[mx]; int main() { int n,m,c1,c2; scanf("%d %d %d %d",&n,&m,&c1,&c2); for(int i=0;i<mx;i++) //init { E[i].clear(); dis[i]=-1; } for(int i=0;i<n;i++){ scanf("%d",&city[i]); } for(int i=0;i<m;i++) { edge tmp; int a,b,l; scanf("%d %d %d",&a,&b,&l); tmp.len=l; tmp.c=b; E[a].push_back(tmp); tmp.c=a; E[b].push_back(tmp); } int nowP=c1; dis[nowP]=0; visited[nowP]=1; csave[nowP]=city[c1]; ccnt[nowP]=1; for(int i=0;i<n;i++) { for(int j=0;j<E[nowP].size();j++) { int tmpc=E[nowP][j].c; int d=E[nowP][j].len; if(visited[tmpc]==1) continue; if(dis[tmpc]==-1||dis[tmpc]>dis[nowP]+d) { dis[tmpc]=dis[nowP]+d; csave[tmpc]=city[tmpc]+csave[nowP]; ccnt[tmpc]=ccnt[nowP]; }else if(dis[tmpc]==dis[nowP]+d) { ccnt[tmpc]+=ccnt[nowP]; if(csave[tmpc]<city[tmpc]+csave[nowP]){ csave[tmpc]=city[tmpc]+csave[nowP]; } } } int min=123456789; for(int j=0;j<n;j++){ if(dis[j]==-1) continue; if(visited[j]==1) continue; if(dis[j]<min) { min=dis[j]; nowP=j; } } visited[nowP]=1; } printf("%d %d\n",ccnt[c2],csave[c2]); return 0; }