#include <iostream>
#include <vector>
#include <queue>
#define INF 1e9 //๋ฌดํ์ ๋ปํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ง์ .
using namespace std;
vector<pair<int, int>>graph[1001];
int d[1001];//๋น์ฉ์ ์ ์ฅํด๋๋ ํ
์ด๋ธ
int N, M, start, fin; //N=๋์(๋
ธ๋)์ ๊ฐ์, M=๋ฒ์ค(๊ฐ์ )์ ๊ฐ์ ,start=์์์ , fin=๋์ฐฉ์
int route[1001]; //์ต์๋น์ฉ์ ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธํ๋ ๋์๋ฅผ ์ ์ฅํ๋ ํ
์ด๋ธ
void dijkstra(int start) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>pq;
pq.push({ 0,start }); //์์์ ์ ๋น์ฉ์ 0
d[start] = 0;
while (!pq.empty()) {
int dist = pq.top().first;
int now = pq.top().second;
pq.pop();
if (d[now] < dist) continue; //์ด๋ฏธ ์ฒ๋ฆฌ๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์ํ๋ค.
for (int i = 0; i < graph[now].size(); i++) {
int neighbor = graph[now][i].first;
int neighborDist = dist + graph[now][i].second;
if (neighborDist < d[neighbor]) {
d[neighbor] = neighborDist;
route[neighbor] = now; //๋ฐฉ๋ฌธํ๋ ๋์ ์ ์ฅ.route[i]=๊ฒฝ๋ก์์ i๋
ธ๋๋ก ๊ฐ๊ธฐ ๋ฐ๋ก ์ง์ ๋
ธ๋
pq.push({ neighborDist,neighbor });
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int a, b, c; cin >> a >> b >> c; //๊ฐ์ ์ ๋ณด ์
๋ ฅ
graph[a].push_back({ b,c }); // a์์ b๊น์ง ๊ฐ๋๋ฐ c๋งํผ์ ๋น์ฉ ํ์
}
cin >> start >> fin;
fill(d, d + 1001, INF);
dijkstra(start);
cout << d[fin] << "\n"; //์ต์๋น์ฉ ์ถ๋ ฅ
vector<int>ans;
int node = fin;
while (node) {
ans.push_back(node);
node = route[node]; //๊ฒฝ๋ก๋ฅผ ์ญ์ผ๋ก ์ ์ฅํ๊ณ 1์ผ ๊ฒฝ์ฐ 0์ด๊ธฐ ๋๋ฌธ์ while ๋ฌธ ํ์ถ
}
cout << ans.size() << '\n';
for (int i = ans.size() - 1; i >= 0; i--) { //์ญ์์ผ๋ก ์ ์ฅ๋๋ฏ๋ก.
cout << ans[i] << " ";
}
}
๋๊ธ