#include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() template inline bool chmax(A &a, B b) { if (a inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; } typedef unsigned long long ull; typedef long long ll; typedef pair pii; typedef pair pll; typedef pair P; const ll INF = 1ll<<29; const ll MOD = 1000000007; const double EPS = 1e-10; int n, m, st, gr; int d[200][200]; vector g[200]; int main() { cin >> n >> m >> st >> gr; fill(d[0], d[n], INF); REP(i, m) { int a, b, c; scanf("%d %d %d", &a, &b, &c); d[a][b] = c; d[b][a] = c; g[a].push_back(pii(b, c)); g[b].push_back(pii(a, c)); } REP(i, n) d[i][i] = 0; REP(k, n) REP(i, n) REP(j, n) chmin(d[i][j], d[i][k] + d[k][j]); REP(i, n) sort(ALL(g[i])); vector ans; ans.push_back(st); while (ans.back() != gr) { int u = ans.back(); REP(i, g[u].size()) { int v = g[u][i].first; if (d[st][u] + g[u][i].second + d[v][gr] == d[st][gr]) { ans.push_back(v); break; } } } REP(i, ans.size()) printf("%d%c", ans[i], i == ans.size() - 1 ? '\n' : ' '); return 0; }