...
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=510;
int peo[maxn],dis[maxn],vis[maxn];
int N,M,c1,c2,route[maxn],sum[maxn];
struct Node{
int t, w;
bool operator<(const Node n) const {
return w>n.w;
}
};
vector<Node> adj[maxn];
void dijkstra(int x){
priority_queue<Node> q;
q.push(Node{x,0});
memset(vis,0,sizeof(vis));
dis[x]=0;
route[x]=1;
sum[x]=peo[x];
while(!q.empty()){
Node n=q.top();
q.pop();
if(vis[n.t]) continue;
vis[n.t]=true;
for(int i=0;i<adj[n.t].size();i++){
Node tmp=adj[n.t][i];
if(dis[tmp.t]>n.w+tmp.w){
dis[tmp.t]=n.w+tmp.w;
route[tmp.t]=route[n.t];
sum[tmp.t]=sum[n.t]+peo[tmp.t];
q.push((Node){tmp.t,dis[tmp.t]});
}
else if(dis[tmp.t]==n.w+tmp.w){
route[tmp.t]+=route[n.t];
sum[tmp.t]=max(sum[tmp.t],sum[n.t]+peo[tmp.t]);
}
}
}
}
int main(){
int s,t,w;
while(scanf("%d%d%d%d",&N,&M,&c1,&c2)==4){
for(int i=0;i<N;i++){
scanf("%d",&peo[i]);
adj[i].clear();
dis[i]=1<<30;
}
for(int i=0;i<M;i++){
scanf("%d%d%d",&s,&t,&w);
adj[s].push_back((Node){t,w});
adj[t].push_back((Node){s,w});
}
dijkstra(c1);
printf("%d %d\n",route[c2],sum[c2]);
}
return 0;
}