#include <iostream>
#include <iomanip>
using namespace std;
#define MAXN 501
#define INFINITE 99999999
struct Graph{
int vexnum;//顶点数
int edge;//边数
int vexdata[MAXN];
int arc[MAXN][MAXN];
};
void Dijkstra(Graph G,int raw,int target){
int Dis[MAXN];
bool Visit[MAXN];
int sum[MAXN];
int way[MAXN];
for(int i=0;i<G.vexnum;i++){
Dis[i]=INFINITE;
Visit[i]=false;
sum[i]=G.vexdata[i];
way[i]=1;
}
Visit[raw]=true;
Dis[raw]=0;
for(int i=0;i<G.vexnum;i++){
if(G.arc[raw][i]!=INFINITE){
Dis[i]=G.arc[raw][i];
sum[i]+=G.vexdata[raw];
}
}
sum[raw]=G.vexdata[raw];
for(int i=0;i<G.vexnum-1;i++){
int vext,edget=INFINITE;
for(int j=0;j<G.vexnum;j++){
if(Visit[j]==false&&Dis[j]<edget){
edget=Dis[j];
vext=j;
}
}
Visit[vext]=true;
for(int j=0;j<G.vexnum;j++){
if(Visit[j]==false&&G.arc[vext][j]!=INFINITE&&Dis[vext]+G.arc[vext][j]<Dis[j]){
Dis[j]=Dis[vext]+G.arc[vext][j];
sum[j]=sum[vext]+G.vexdata[j];
way[j]=way[vext];
}else if(Visit[j]==false&&G.arc[vext][j]!=INFINITE&&Dis[vext]+G.arc[vext][j]==Dis[j]){
way[j]+=way[vext];
if(sum[j]<sum[vext]+G.vexdata[j]){
sum[j]=sum[vext]+G.vexdata[j];
}
}
}
if(vext==target){
break;
}
}
cout<<way[target]<<" "<<sum[target]<<endl;
}
int main()
{
Graph G;
int now,target;
cin>>G.vexnum>>G.edge;
cin>>now>>target;
for(int i=0;i<G.vexnum;i++){
cin>>G.vexdata[i];
}
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
G.arc[i][j]=INFINITE;
}
}
for(int i=0;i<G.edge;i++){
int x,y;
cin>>x>>y;
int l;
cin>>l;
G.arc[x][y]=l;
G.arc[y][x]=l;
}
Dijkstra(G,now,target);
return 0;
}
注意是无向图