#include<iostream>
#include<cstring>
using namespace std;
const int inf=1000000000;
int N,M,S,D,e[510][510],cost[510][510],d[510],c[510],pre[510];
bool vis[510];
void dij(int start){
memset(vis,false,sizeof(vis));
fill(d,d+510,inf);
fill(c,c+510,inf);
d[start]=0;
c[start]=0;
for(int i=0;i<510;i++) pre[i]=i;
for(int i=0;i<N;i++){
int u=-1,minn=inf;
for(int j=0;j<N;j++){
if(vis[j]==false&&minn>d[j]){
u=j;
minn=d[j];
}
}
if(u==-1) break;
vis[u]=true;
for(int v=0;v<N;v++){
if(vis[v]==false&&e[u][v]!=inf){
if(d[v]>d[u]+e[u][v]){
d[v]=d[u]+e[u][v];
c[v]=c[u]+cost[u][v];
pre[v]=u;
}else if(d[v]==d[u]+e[u][v]){
if(c[v]>c[u]+cost[u][v]){
c[v]=c[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
}
void dfs(int endl){
if(endl==S){
printf("%d ",S);
return;
}
dfs(pre[endl]);
printf("%d ",endl);
}
int main(){
int a,b;
fill(e[0],e[0]+510*510,inf);
fill(cost[0],cost[0]+510*510,inf);
scanf("%d%d%d%d",&N,&M,&S,&D);
for(int i=0;i<M;i++){
cin>>a>>b;
cin>>e[a][b]>>cost[a][b];
e[b][a]=e[a][b];
cost[b][a]=cost[a][b];
}
dij(S);
dfs(D);
printf("%d %d",d[D],c[D]);
return 0;
}