#include #define mp make_pair #define mt make_tuple #define pb push_back #define rep(i, n) for (int i = 0; i < (n); i++) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair pii; typedef pair pll; const int INF = 1 << 29; const double EPS = 1e-9; const int MOD = 100000007; const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1}; struct edge{ int b,c; edge(int _b, int _c){ b = _b; c = _c; } bool operator < (const edge& e)const { return this->c < e.c; } }; struct state{ int pos, cost; state(int _pos, int _cost){ pos = _pos; cost = _cost; } bool operator < (const state& s) const { return this->cost < s.cost; } }; vector edges[220]; int d[220]; int N,M,S,G; int path[220]; void dijkstra(int s){ fill(path , path + N, INF); fill(d, d + N, INF); d[s] = 0; priority_queue que; que.push(state(s, 0)); while (!que.empty()){ state p = que.top(); que.pop(); int v = p.pos; if (d[v] < p.cost)continue; for (int i = 0; i < edges[v].size(); i++){ edge e = edges[v][i]; if (d[e.b] > d[v] + e.c){ d[e.b] = d[v] + e.c; path[e.b] = v; que.push(state(e.b, d[e.b])); } else if(d[e.b] == d[v] + e.c){ path[e.b] = min(path[e.b], v); } } } } int main() { cin >> N >> M >> S >> G; for (int i = 0; i < M; i++){ int a,b,c; cin >> a >> b >> c; edges[a].push_back(edge(b, c)); edges[b].push_back(edge(a, c)); } dijkstra(G); vector res; int p = S; while (p != G){ res.push_back(p); p = path[p]; } res.push_back(G); // reverse(res.begin(), res.end()); for (int i = 0; i < res.size(); i++){ cout << res[i] << " "; } cout << endl; return 0; }