// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 1000001
#define INF (1ll<<59)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, m, s, t ;
ll arr[MAXN];
ll d[MAXN] ;
vector<pair<ll,ll>>adj[MAXN] ;
//**Struct**//
struct e {
ll u, v, w ;
} edge[MAXN] ;
//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
if(x > y ) {
x = y ;
return true ;
} else return false;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
if(x < y ) {
x = y ;
return true;
} else return false ;
}
void init() {
cin>>n>>m;
FOR(i,1, m) {
ll x, y, w ;
cin >> x>> y >> w;
edge[i].u = x ;
edge[i].v = y ;
edge[i].w = w ;
adj[x].push_back({y, w}) ;
}
cin >> s >> t;
}
void dijkstra(ll st ) {
REP(i, MAXN ) d[i]= INF ;
d[st] = 0 ;
priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<>> pq ;
pq.push({0, st}) ;
while(!pq.empty()) {
pair<ll,ll> u = pq.top() ;
pq.pop() ;
if(d[u.se] > u.fi) continue ;
for(pair<ll,ll> v: adj[u.se ]) {
if( minimize(d[v.fi], v.se + u.fi ) ) {
pq.push({d[v.fi], v.fi}) ;
}
}
}
}
vector<ll>DAG [MAXN] ;
void build_DAG() {
FOR(i, 1, m) {
if(d[edge[i].u] + edge[i].w == d[edge[i].v] ) {
DAG[edge[i].u].push_back(edge[i].v ) ;
}
}
}
bool check = false;
vector<ll> path ;
void dfs(ll u ) {
if(u == t) check = true;
path.push_back(u);
if(check ) return ;
vector<ll> temp ;
for(ll v : DAG[u]) {
temp.push_back(v) ;
}
sort(temp.begin(), temp.end()) ;
for(ll v : temp ) {
dfs(v) ;
if(check ) return ;
}
path.pop_back() ;
}
void solve() {
dijkstra(s) ;
build_DAG();
dfs(s) ;
cout << d[t] << el ;
for(ll v : path ) cout << v << " " ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
init();
solve();
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBfX1JPT1RfXyBpbnQgbWFpbigpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMiIpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAxMDAwMDAxCiNkZWZpbmUgSU5GICgxbGw8PDU5KQojZGVmaW5lIEJMT0NLX1NJWkUgNDI1CiNkZWZpbmUgTUFYX05PREUgMTAwMTAwMQojZGVmaW5lIExPRyAxOQojZGVmaW5lIEFMUEhBX1NJWkUgMjYKI2RlZmluZSBCQVNFIDMxMQojZGVmaW5lIE5BTUUgImZpbGUiCiNkZWZpbmUgY29tcGFyZSh2KSBzb3J0KCh2KS5iZWdpbigpLCAodikuZW5kKCkpOyAodikuZXJhc2UodW5pcXVlKCh2KS5iZWdpbigpLCAodikuZW5kKCkpLCAodikuZW5kKCkpOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBsbCBNT0RbXSA9IHsobGwpMWU5ICsgMjI3NywgKGxsKTFlOSArIDUyNzcsIChsbCkxZTkgKyA4Mjc3LCAobGwpMWU5ICsgOTI3NywgKGxsKSAxZTkgKyA3IH07CmNvbnN0IGxsIE5NT0QgPSAxOwpjb25zdCBpbnQgZHhbXSA9IHstMSwgMCwgMSwwfTsKY29uc3QgaW50IGR5W10gPSB7MCwgMSwgMCwgLTF9OwovLyoqVmFyaWFibGUqKi8vCmxsIG4sIG0sIHMsICB0IDsKbGwgYXJyW01BWE5dOwpsbCBkW01BWE5dIDsKdmVjdG9yPHBhaXI8bGwsbGw+PmFkaltNQVhOXSA7Ci8vKipTdHJ1Y3QqKi8vCnN0cnVjdCBlIHsKICAgIGxsIHUsIHYsIHcgOwp9IGVkZ2VbTUFYTl0gOwovLyoqRnVuY3Rpb24qKi8vCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFkgPgpib29sIG1pbmltaXplKFggJiB4LCBjb25zdCBZICZ5ICkgewogICAgaWYoeCA+IHkgKSB7CiAgICAgICAgeCA9IHkgOwogICAgICAgIHJldHVybiB0cnVlIDsKICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7Cn0KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWSA+CmJvb2wgbWF4aW1pemUoWCAmeCwgY29uc3QgWSAmeSApIHsKICAgIGlmKHggPCB5ICApIHsKICAgICAgICB4ID0geSAgOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHJldHVybiBmYWxzZSA7Cn0KCnZvaWQgaW5pdCgpIHsKICAgIGNpbj4+bj4+bTsKICAgIEZPUihpLDEsIG0pIHsKICAgICAgICBsbCB4LCB5LCB3IDsKICAgICAgICBjaW4gPj4geD4+IHkgPj4gdzsKICAgICAgICBlZGdlW2ldLnUgPSB4IDsKICAgICAgICBlZGdlW2ldLnYgPSB5IDsKICAgICAgICBlZGdlW2ldLncgPSB3ICA7CiAgICAgICAgYWRqW3hdLnB1c2hfYmFjayh7eSwgd30pIDsKICAgIH0KICAgIGNpbiA+PiBzID4+IHQ7Cn0Kdm9pZCBkaWprc3RyYShsbCBzdCApIHsKICAgIFJFUChpLCBNQVhOICkgZFtpXT0gSU5GIDsKICAgIGRbc3RdID0gMCA7CiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGxsLGxsPiwgdmVjdG9yPHBhaXI8bGwsbGw+PiwgZ3JlYXRlcjw+PiBwcSA7CiAgICBwcS5wdXNoKHswLCBzdH0pIDsKICAgIHdoaWxlKCFwcS5lbXB0eSgpKSB7CiAgICAgICAgcGFpcjxsbCxsbD4gdSA9IHBxLnRvcCgpIDsKICAgICAgICBwcS5wb3AoKSA7CiAgICAgICAgaWYoZFt1LnNlXSA+IHUuZmkpIGNvbnRpbnVlIDsKICAgICAgICBmb3IocGFpcjxsbCxsbD4gIHY6IGFkalt1LnNlIF0pIHsKICAgICAgICAgICAgaWYoIG1pbmltaXplKGRbdi5maV0sIHYuc2UgKyB1LmZpICkgKSB7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtkW3YuZmldLCB2LmZpfSkgOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CnZlY3RvcjxsbD5EQUcgW01BWE5dIDsKdm9pZCBidWlsZF9EQUcoKSB7CiAgICBGT1IoaSwgMSwgbSkgewogICAgICAgIGlmKGRbZWRnZVtpXS51XSArIGVkZ2VbaV0udyA9PSBkW2VkZ2VbaV0udl0gKSB7CiAgICAgICAgICAgIERBR1tlZGdlW2ldLnVdLnB1c2hfYmFjayhlZGdlW2ldLnYgKSA7CiAgICAgICAgfQogICAgfQp9CmJvb2wgY2hlY2sgPSBmYWxzZTsKdmVjdG9yPGxsPiBwYXRoIDsKdm9pZCBkZnMobGwgdSAgKSB7CiAgICBpZih1ID09IHQpIGNoZWNrID0gdHJ1ZTsKICAgIHBhdGgucHVzaF9iYWNrKHUpOwogICAgaWYoY2hlY2sgKSByZXR1cm4gOwogICAgdmVjdG9yPGxsPiB0ZW1wIDsKICAgIGZvcihsbCB2IDogREFHW3VdKSB7CiAgICAgICAgdGVtcC5wdXNoX2JhY2sodikgOwogICAgfQogICAgc29ydCh0ZW1wLmJlZ2luKCksIHRlbXAuZW5kKCkpICA7CiAgICBmb3IobGwgdiA6IHRlbXAgKSB7CiAgICAgICAgZGZzKHYpIDsKICAgICAgICBpZihjaGVjayApIHJldHVybiA7CiAgICB9CiAgICBwYXRoLnBvcF9iYWNrKCkgOwp9CnZvaWQgc29sdmUoKSB7CiAgICBkaWprc3RyYShzKSA7CiAgICBidWlsZF9EQUcoKTsKICAgIGRmcyhzKSA7CiAgICBjb3V0IDw8IGRbdF0gPDwgZWwgOwogICAgZm9yKGxsIHYgOiBwYXRoICkgY291dCA8PCB2IDw8ICIgIiA7Cn0KCl9fUk9PVF9fIHsKLy8gICAgIGZyZW9wZW4oTkFNRSIuaW5wIiAsICJyIiAsIHN0ZGluKTsKLy8gICAgIGZyZW9wZW4oTkFNRSIub3V0IiAsICJ3Iiwgc3Rkb3V0KSA7CiAgICBmYXN0OwogICAgaW5pdCgpOwogICAgc29sdmUoKTsKfQoKCg==