#include using namespace std; const int INF = 1 << 30; typedef pair< int, int > Pi; struct edge { int to, cost; }; vector< edge > graph[10000]; int N, M, S, G; int main() { scanf("%d %d %d %d", &N, &M, &S, &G); while(M--) { int a, b, c; scanf("%d %d %d", &a, &b, &c); graph[a].push_back((edge){b, c}); graph[b].push_back((edge){a, c}); } priority_queue< Pi, vector< Pi >, greater< Pi > > que; que.emplace(0, S); vector< Pi > v(N, Pi(INF, INF)); v[S] = {0, -1}; while(!que.empty()) { auto p = que.top(); que.pop(); for(auto& e : graph[p.second]) { if(Pi(p.first + e.cost, p.second) >= v[e.to]) continue; v[e.to] = Pi(p.first + e.cost, p.second); que.emplace(v[e.to].first, e.to); } } vector< int > dd; int now = v[G].second; dd.push_back(G); while(now != -1) { dd.push_back(now); now = v[now].second; } bool first = false; for(int i = dd.size() - 1; i >= 0; i--) { if(first++) putchar(' '); printf("%d", dd[i]); } putchar('\n'); }