#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n, m, s, d;
int e[510][510], cost[510][510], dis[510];
int inf = 999999999;
bool visit[510];
vector<int> pre[510], temppath, path;
int finalcost=inf;
void dfs(int vv) {
temppath.push_back(vv);
if (vv == s) {
int tempcost=0;
for (int i = temppath.size()-1; i >0; i--) {
int id = temppath[i], nextid = temppath[i - 1];
tempcost += cost[id][nextid];
}
if (tempcost<finalcost) {
finalcost = tempcost;
path = temppath;
}
temppath.pop_back();
return;
}
for (int i = 0; i < pre[vv].size(); i++) {
dfs(pre[vv][i]);
}
temppath.pop_back();
}
int main() {
cin >> n >> m >> s >> d;
fill(e[0], e[0] + 510 * 510, inf);
//fill(cost[0], cost[0] + 510 * 510, inf);
fill(dis, dis+510, inf);
//fill(visit, visit + 510, false);
for (int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
scanf("%d", &e[a][b]);
e[b][a] = e[a][b];
scanf("%d", &cost[a][b]);
cost[b][a] = cost[a][b];
}
/*for (int i = 0; i < m; i++) {
int c1, c2, di, co;
cin >> c1 >> c2 >> di >> co;
e[c1][c2] = e[c2][c1] = di;
cost[c1][c2] = cost[c2][c1] = co;
}*/
pre[s].push_back(s);
dis[s] = 0;
for (int i = 0; i < n; i++) {
int u = -1, min = inf;
for (int j = 0; j < n; j++) {
if (visit[j] == false &&dis[j]<min) {
min = dis[j];
u = j;
}
}
if (u == -1)break;
visit[u] = true;
for (int v = 0; v < n; v++) {
if (visit[v] == false&&e[u][v]!=inf) {
if (dis[v] > dis[u] + e[u][v]) {
dis[v] = dis[u] + e[u][v];
pre[v].clear();
pre[v].push_back(u);
}
else if (dis[v] == dis[u] + e[u][v]) {
pre[v].push_back(u);
}
}
}
dfs(d);
for (int i = path.size() - 1; i >= 0; i--)
printf("%d ", path[i]);
printf("%d %d", dis[d], finalcost);
}
return 0;
}