#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> edges(501,vector<int>(501,INT_MAX));
//有向图
vector<int> dis(501,INT_MAX),weight(501,0),w(501,0),nums(501,0);
//分别对应从原点到某点的最短距离,某点所拥有的救援队人数,从原点到某点积累的救援队人数,从原点到某点的最短路径数量
vector<bool> visited(501,false);//已确认的最短路径定点集合
int N,M,C1,C2;
int main(){
cin>>N>>M>>C1>>C2;
for(int i=0;i<N;i++) cin>>weight[i];
for(int i=0;i<M;i++){
int r,c,value;
cin>>r>>c>>value;
edges[r][c]=value,edges[c][r]=value;
}
w[C1]=weight[C1];
nums[C1]=1;
dis[C1]=0;
for(int i=0;i<N;i++){
int u=-1,minn=INT_MAX;
for(int j=0;j<N;j++){
if(!visited[j]&&dis[j]<minn){
u=j;
minn=dis[j];
}
}
if(u==-1) break;
visited[u]=true;
for(int j=0;j<N;j++){
if(!visited[j]&&edges[u][j]!=INT_MAX&&dis[u]+edges[u][j]<dis[j]){
dis[j]=dis[u]+edges[u][j];
nums[j]=nums[u];
w[j]=weight[j]+w[u];
}else if(!visited[j]&&edges[u][j]!=INT_MAX&&dis[u]+edges[u][j]==dis[j]){
nums[j]+=nums[u];
if(w[j]<weight[j]+w[u]) w[j]=weight[j]+w[u];
}
}
}
cout<<nums[C2]<<' '<<w[C2];
return 0;
}
一遍过了……感觉不真实(太模糊了)