//深度优先算法
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
using namespace std;
//#define fin cin
int n,m,s,d;
int road[510][510];
int shortest=-1;
int lastcost=-1;
int lastlength;
vector<int> ans;
int cost[510][510];
//df(s,0,way,0);
void df(int from,int length,vector<int> way,int co)
{
if(from==d)
{
if(length<shortest||shortest==-1)
{
shortest=length;
ans=way;
lastcost=co;
lastlength=length;
}
else if(length==shortest&&co<lastcost)
{
shortest=length;
ans=way;
lastcost=co;
lastlength=length;
}
}
else
{
if(find(way.begin(),way.end(),from)==way.end())
way.push_back(from);
for(int i=0;i<n;i++)
{
if(road[from][i]!=-1&&(find(way.begin(),way.end(),i)==way.end()))
{
way.push_back(i);
df(i,length+road[from][i], way, co+cost[from][i]);
way.pop_back();
}
}
}
}
int main()
{
/*ifstream fin("d:\in.txt" );
if (! fin.is_open())
{
cout << "Error opening file";
system("pause");
exit (1);
}*/
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
road[i][j]=-1;
road[j][i]=-1;
cost[i][j]=-1;
cost[j][i]=-1;
}
}
for(int i=0;i<m;i++)
{
int c1,c2,length ,co;
cin>>c1>>c2>>length>>co;
road[c1][c2]=length;
road[c2][c1]=length;
cost[c1][c2]=co;
cost[c2][c1]=co;
}
vector<int> way;
//void df(int from,int length,vector<int> way,int co)
df(s,0,way,0);
for(int i=0;i<ans.size();i++)
{
cout<<ans[i]<<" ";
}
cout<<lastlength<<" ";
cout<<lastcost;
system("PAUSE");
return 0;
}