#include<stdio.h>
#include<vector>
#define INF 10000000;
using namespace std;
int length[500][500];
int time[500][500];
int dis[500], dispre[500], timepre[500], weight[500];
vector<int> lengthRoute, timeRoute;
void getLengthRoute(int i, int start)
{
lengthRoute.push_back(i);
if (i == start)
{
return;
}
getLengthRoute(dispre[i], start);
}
void getTimeRoute(int i, int start)
{
timeRoute.push_back(i);
if (i == start)
{
return;
}
getTimeRoute(timepre[i], start);
}
int main()
{
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
length[i][j] = -1;
time[i][j] = -1;
}
}
for (int i = 0; i < M; i++)
{
int v1, v2, oneway, l, t;
scanf("%d%d%d%d%d", &v1, &v2, &oneway, &l, &t);
length[v1][v2] = l;
time[v1][v2] = t;
if (oneway == 0)
{
length[v2][v1] = l;
time[v2][v1] = t;
}
}
int start, end;
scanf("%d%d", &start, &end);
bool visit[500];
for (int i = 0; i < N; i++)
{
dis[i] = -1;
dispre[i] = i;
visit[i] = false;
weight[i] = INF;
}
dis[start] = 0;
weight[start] = 0;
for (int i = 0; i < N; i++)
{
int update = -1, min = INF;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && dis[j] != -1 && dis[j] < min)
{
update = j;
min = dis[j];
}
}
if (update == -1)
{
break;
}
visit[update] = true;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && length[update][j] != -1)
{
if (dis[j] == -1 || length[update][j] + dis[update] < dis[j])
{
dis[j] = length[update][j] + dis[update];
dispre[j] = update;
weight[j] = weight[update] + time[update][j];
}
else if (dis[j] != -1 && length[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + time[update][j])
{
weight[j] = weight[update] + time[update][j];
dispre[j] = update;
}
}
}
}
getLengthRoute(end, start);
int ansLength = dis[end];
for (int i = 0; i < N; i++)
{
dis[i] = -1;
visit[i] = false;
weight[i] = INF;
timepre[i] = i;
}
dis[start] = 0;
weight[start] = 0;
for (int i = 0; i < N; i++)
{
int update = -1, min = INF;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && dis[j] != -1 && dis[j] < min)
{
min = dis[j];
update = j;
}
}
if (update == -1)
{
break;
}
visit[update] = true;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && time[update][j] != -1)
{
if (dis[j] == -1 || dis[j] > dis[update] + time[update][j])
{
timepre[j] = update;
dis[j] = dis[update] + time[update][j];
weight[j] = weight[update] + 1;
}
else if (dis[j] != -1 && time[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + 1)
{
timepre[j] = update;
weight[j] = weight[update] + 1;
}
}
}
}
getTimeRoute(end, start);
int ansTime = dis[end];
bool isDistinct = false;
if (timeRoute.size() != lengthRoute.size())
{
isDistinct = true;
}
else
{
for (int i = 0; i < timeRoute.size(); i++)
{
if (timeRoute[i] != lengthRoute[i])
{
isDistinct = true;
break;
}
}
}
if (!isDistinct)
{
printf("Distance = %d; Time = %d: %d", ansLength, ansTime, start);
for (int i = lengthRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", lengthRoute[i]);
}
printf("\n");
}
else
{
printf("Distance = %d: %d", ansLength, start);
for (int i = lengthRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", lengthRoute[i]);
}
printf("\n");
printf("Time = %d: %d", ansTime, start);
for (int i = timeRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", timeRoute[i]);
}
printf("\n");
}
return 0;
}