#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using ull = unsigned long long; const ll INF = 1e16; const ll MOD = 1e9 + 7; #define REP(i, n) for(ll i = 0; i < n; i++) bool comp(vector &a, vector &b){ REP(i, min(a.size(), b.size())){ if(a[i] != b[i]) return a[i] > b[i]; } return a.size() > b.size(); } using P = pair; int main() { ll n, m, S, G; cin >> n >> m >> S >> G; vector> g(n); REP(i, m){ ll a, b, c; cin >> a >> b >> c; g[a].push_back({b, c}); g[b].push_back({a, c}); } vector dist(n, INF); dist[G] = 0; priority_queue, greater

> que; que.push({0, G}); while(!que.empty()){ auto tmp = que.top(); que.pop(); ll d = tmp.first, now = tmp.second; if(dist[now] < d) continue; for(auto &x : g[now]){ ll v = x.first, c = x.second; ll cost = dist[now] + c; if(dist[v] > cost){ dist[v] = cost; que.push({cost, v}); } } } string ans; ans += '0' + S; for(ll now = S; now != G;){ ll mn = INF; for(auto &x : g[now]){ ll v = x.first, c = x.second; if(dist[now] == dist[v] + c){ mn = min(mn, v); } } now = mn; ans += '0' + mn; } REP(i, ans.size()){ cout << ans[i] << " \n"[i == ans.size() - 1]; } }