#include<bits/stdc++.h>
using namespace std;
int N, M;
bool visited[510];
int disGraph[510][510], timeGraph[510][510];
int d1, d2, dis[510];//d1起点 d2终点
vector<int> disPath, timePath, tem;
vector<int> pre[510];
int minTime = INT_MAX, minNum = INT_MAX;
void dfsDis(int start, int time){ //对若干条最 短 路径DFS
tem.push_back(start);
if(start == d1){
if(time < minTime){
disPath = tem;
minTime = time;
}
}
for(int i = 0; i < pre[start].size(); i++)
dfsDis(pre[start][i], time + timeGraph[pre[start][i]][start]);// !!!timeGraph[pre[start][i]][start]顺序:先pre[start][i] 后start
tem.pop_back();
}
void dfsTime(int start, int num){ //对若干条最 快 路径DFS
tem.push_back(start);
if(start == d1){
if(num < minNum){
timePath = tem;
minNum = num;
}
}
for(int i = 0; i < pre[start].size(); i++)
dfsTime(pre[start][i], num + 1);
tem.pop_back();
}
void display(vector<int> v){
printf("%d", v[v.size()-1]);
for(int i = v.size() - 2; i >= 0; i--)
printf(" -> %d", v[i]);
}
bool cmp1(vector<int> a, vector<int> b){
for(int i = 0; i < a.size() && i < b.size(); i++){
if(a[i] != b[i])
return false;
}
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
cin>>N>>M;
int one_way, len, time;
fill(disGraph[0], disGraph[0] + 510 * 510, INT_MAX);// !!!写成disGraph[0] + N * N时会出错(无法赋值)
fill(timeGraph[0], timeGraph[0] + 510 * 510, INT_MAX);
for(int i = 0; i < M; i++){
scanf("%d %d %d %d %d", &d1, &d2, &one_way, &len, &time);
disGraph[d1][d2] = len;
timeGraph[d1][d2] = time;
if(one_way == 0){
disGraph[d2][d1] = len;
timeGraph[d2][d1] = time;
}
}
scanf("%d %d", &d1, &d2);
//Dijkstra最短路
fill(visited, visited + N, false);
fill(dis, dis + N, INT_MAX);
dis[d1] = 0;
for(int i = 0; i < N; i++){
int minDis = INT_MAX, u = -1;
for(int j = 0; j < N; j++){
if(!visited[j] && minDis > dis[j]){
u = j;
minDis = dis[j];
}
}
if(u == -1) break;
visited[u] = true;
for(int v = 0; v < N; v++){
if(!visited[v] && disGraph[u][v] < INT_MAX){
if(dis[v] > dis[u] + disGraph[u][v]){
dis[v] = dis[u] + disGraph[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[v] == dis[u] + disGraph[u][v])
pre[v].push_back(u);
}
}
}
int D = dis[d2];
tem.clear();
dfsDis(d2, 0);
//Dijkstra最快路
for(int i = 0; i < 510; i++)
pre[i].clear(); // !!!
fill(visited, visited + N, false);
fill(dis, dis + N, INT_MAX);
dis[d1] = 0;
for(int i = 0; i < N; i++){
int minDis = INT_MAX, u = -1;
for(int j = 0; j < N; j++){
if(!visited[j] && minDis > dis[j]){
u = j;
minDis = dis[j];
}
}
if(u == -1) break;
visited[u] = true;
for(int v = 0; v < N; v++){
if(!visited[v] && timeGraph[u][v] < INT_MAX){
if(dis[v] > dis[u] + timeGraph[u][v]){
dis[v] = dis[u] + timeGraph[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[v] == dis[u] + timeGraph[u][v])
pre[v].push_back(u);
}
}
}
tem.clear(); // !!!
int T = dis[d2];
dfsTime(d2, 1);
if(cmp1(disPath, timePath)){
printf("Distance = %d; Time = %d: ", D, T);
display(disPath);
}else{
printf("Distance = %d: ", D);
display(disPath);
printf("\nTime = %d: ", T);
display(timePath);
}
return 0;
}