#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<stack>
#define inf 1000000
using namespace std;
int n,m,s,d;
int dist[505][505];
int cost[505][505];
int vis[505];//访问标记
int td,tc;//结果
vector<int> v;//搜索时存放器
vector<int> av;//搜索结果
void dfs(int q,int m,int dis){
if(q==d){
if(dis<td || (dis==td &&m<tc)){
tc=m;
td=dis;
av=v;
}
return ;
}
if(dis>td)return;
for(int i=0;i<n;i++){
if(vis[i]==0 && dist[q][i]!=inf){
v.push_back(i);
vis[i]=1;
dfs(i,m+cost[q][i],dis+dist[q][i]);
v.pop_back();//回溯
vis[i]=0;//回溯,建议这样写,这样可以保证回溯
}
}
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dist[i][j]=inf;
}
}
for(int i=0;i<m;i++){
int c1,c2,di,c;
scanf("%d%d%d%d",&c1,&c2,&di,&c);
dist[c1][c2]=dist[c2][c1]=di;
cost[c1][c2]=cost[c2][c1]=c;
}
td=tc=inf;
vis[s]=1;// 提前处理s点
v.push_back(s);//提前处理s点
dfs(s,0,0);
for(int i=0;i<av.size();i++){
cout<<av[i]<<" ";
}
cout<<td<<" "<<tc;
return 0;
}
#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<stack>
#define inf 1000000
using namespace std;
int n,m,s,d;
int dist[505][505];
int cost[505][505];
int vis[505];
int pre[505];
int td,tc;
vector<int> v;
vector<int> av;
void dfs(int q,int m,int dis){
v.push_back(q);
vis[q]=1;//如果在这里处理数据的话,要保证回溯法成立,每一个return前都要有回溯,否则会丢掉一些回溯,导致结果错误,所以不建议这样写
if(q==d){
if(dis<td || (dis==td && m<tc)){
tc=m;
td=dis;
av=v;
}
v.pop_back();
vis[q]=0; //回溯
return ;
}
if(dis>td){
v.pop_back();
vis[q]=0; //回溯
return;
}
for(int i=0;i<n;i++){
if(vis[i]==0 && dist[q][i]!=inf){
//建议在这里处理v,vis[]
dfs(i,m+cost[q][i],dis+dist[q][i]);
//建议将回溯写在这里,保证可以回溯
}
}
v.pop_back();
vis[q]=0;//回溯
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dist[i][j]=inf;
}
}
for(int i=0;i<m;i++){
int c1,c2,di,c;
scanf("%d%d%d%d",&c1,&c2,&di,&c);
dist[c1][c2]=dist[c2][c1]=di;
cost[c1][c2]=cost[c2][c1]=c;
}
td=tc=inf;
dfs(s,0,0);
for(int i=0;i<av.size();i++){
cout<<av[i]<<" ";
}
cout<<td<<" "<<tc;
return 0;
}