solution
# include <iostream>
# include <vector>
# include <cstring>
# include <algorithm>
using namespace std;
const int N = 510 ;
vector< int > pre[ N] ;
int vis[ N] ;
int map[ 510 ] [ 510 ] , dis[ 510 ] , money[ 510 ] [ 510 ] ;
int n, m, s, d;
const int inf= 9999999 ;
vector< int > path, temppath;
int mincost = inf;
void dfs ( int v)
{
temppath. push_back ( v) ;
if ( v == s)
{
int tempcost = 0 ;
for ( int i = temppath. size ( ) - 1 ; i > 0 ; i-- )
{
int id = temppath[ i] , nextid = temppath[ i - 1 ] ;
tempcost += money[ id] [ nextid] ;
}
if ( tempcost < mincost)
{
mincost = tempcost;
path = temppath;
}
temppath. pop_back ( ) ;
return ;
}
for ( int i = 0 ; i < pre[ v] . size ( ) ; i++ )
dfs ( pre[ v] [ i] ) ;
temppath. pop_back ( ) ;
}
int main ( )
{
memset ( dis, inf, sizeof dis) ;
memset ( map, inf, sizeof map) ;
cin >> n >> m >> s >> d;
for ( int i = 0 ; i < m; i++ )
{
int a, b;
scanf ( "%d%d" , & a, & b) ;
scanf ( "%d" , & map[ a] [ b] ) ;
map[ b] [ a] = map[ a] [ b] ;
scanf ( "%d" , & money[ a] [ b] ) ;
money[ b] [ a] = money[ a] [ b] ;
}
pre[ s] . push_back ( s) ;
dis[ s] = 0 ;
for ( int i = 0 ; i < n; i++ )
{
int u = - 1 , minn = inf;
for ( int j = 0 ; j < n; j++ )
{
if ( vis[ j] == false && dis[ j] < minn)
{
u = j;
minn = dis[ j] ;
}
}
if ( u == - 1 ) break ;
vis[ u] = true ;
for ( int v = 0 ; v < n; v++ ) {
if ( vis[ v] == false && map[ u] [ v] != 0x3f3f3f ) {
if ( dis[ v] > dis[ u] + map[ u] [ v] ) {
dis[ v] = dis[ u] + map[ u] [ v] ;
pre[ v] . clear ( ) ;
pre[ v] . push_back ( u) ;
} else if ( dis[ v] == dis[ u] + map[ 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] , mincost) ;
}