题目链接
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 510;
int N, M, S, D;
int num[MAXN], g[MAXN][MAXN], cnt[MAXN], weight[MAXN], path[MAXN], dis[MAXN];
bool st[MAXN];
int res;
void print(int x){
if(x == S){
cout << x;
return;
}
print(path[x]);
cout << " " << x;
}
void dijkstra(){
memset(dis, 0x3f, sizeof dis);
dis[S] = 0;
cnt[S] = 1;
weight[S] = num[S];
for(int i = 1; i < N; ++i){
int t = -1;
for(int j = 0; j < N; ++j)
if(!st[j] && (t == -1 || dis[j] < dis[t]))
t = j;
st[t] = 1;
for(int j = 0; j < N; ++j){
if(dis[t] + g[t][j] < dis[j]){
dis[j] = dis[t] + g[t][j];
cnt[j] = cnt[t];
weight[j] = weight[t] + num[j];
path[j] = t;
}else if(dis[t] + g[t][j] == dis[j]){
cnt[j] += cnt[t];
if(weight[t] + num[j] > weight[j]){
weight[j] = weight[t] + num[j];
path[j] = t;
}
}
}
}
}
signed main(){
memset(g, 0x3f, sizeof g);
cin >> N >> M >> S >> D;
for(int i = 0; i < N; ++i) cin >> num[i];
for(int i = 1; i <= M; ++i){
int st, ed, le;
cin >> st >> ed >> le;
g[st][ed] = min(g[st][ed], le);
g[ed][st] = min(g[ed][st], le);
}
dijkstra();
cout << cnt[D] << " " << weight[D] << endl;
print(D);
return 0;
}