#include<bits/stdc++.h>
using namespace std;
const int MAXN=510;
const int INF=1000000000;
int G[MAXN][MAXN];
int cost[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN]={false};
vector<int> pre[MAXN];
int n,m,s,dd;
vector<int> path,temppath;
int optcos=INF;
void dij(int v){
fill(dis,dis+MAXN,INF);
dis[v]=0;
for(int i=0;i<n;i++){
int k=-1;int MINlen=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&dis[j]<MINlen){
MINlen=dis[j];k=j;
}
}
if(k==-1) return;
vis[k]=true;
for(int j=0;j<n;j++){
if(vis[j]==false&&G[k][j]!=INF){
if(dis[k]+G[k][j]<dis[j]){
dis[j]=dis[k]+G[k][j];
pre[j].clear();
pre[j].push_back(k);
}else if(dis[k]+G[k][j]==dis[j]){
pre[j].push_back(k);
}
}
}
}
}
void dfs(int v){
temppath.push_back(v);
if(v==s){
int mincos=0;
for(int i=temppath.size()-1;i>0;i--){
int id=temppath[i];
int nextid=temppath[i-1];
mincos+=cost[id][nextid];
}
if(mincos<optcos){
optcos=mincos;
path=temppath;
}
temppath.pop_back();
return;
}
for(int i=0;i<pre[v].size();i++){
dfs(pre[v][i]);
}
temppath.pop_back();
}
int main()
{
// freopen("in.txt","r",stdin);
//cin>>n>>m>>s>>dd;
scanf("%d%d%d%d",&n,&m,&s,&dd);
fill(G[0],G[0]+MAXN*MAXN,INF);
fill(cost[0],cost[0]+MAXN*MAXN,INF);
for(int i=0;i<m;i++){
int start,end,len,cos;
//cin>>start>>end>>len>>cos;
scanf("%d%d%d%d",&start,&end,&len,&cos);
G[start][end]=len;
G[end][start]=len;
cost[start][end]=cos;
cost[end][start]=cos;
}
dij(s);
dfs(dd);
for(int i=path.size()-1;i>=0;i--){
//if(i==path.size()-1) cout<<path[i];
//else cout<<' '<<path[i];
printf("%d ",path[i]);
}
printf("%d %d",dis[dd],optcos);
//cout<<dis[dd]<<' '<<optcos<<endl;
return 0;
}