#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
struct node
{
int next, length, time;
};
void print(vector<int> v)
{
int size = v.size(), i;
for(i = 0; i < size; i++)
{
if(i > 0)
{
printf(" -> ");
}
printf("%d", v[i]);
}
printf("\n");
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int i, flag, v1, v2;
vector<node> v[510];
node nod;
for(i = 1; i <= m; i++)
{
scanf("%d%d%d%d%d", &v1, &v2, &flag, &nod.length, &nod.time);
nod.next = v2;
v[v1].push_back(nod);
if(flag == 0)
{
nod.next = v1;
v[v2].push_back(nod);
}
}
int begin, end;
scanf("%d%d", &begin, &end);
int mark[510], length[510], time[510];
memset(mark, 0, sizeof(mark));
memset(length, -1, sizeof(length));
memset(time, -1, sizeof(time));
vector<int> path1[510];
int p = begin;
path1[p].push_back(p);
mark[p] = 1;
length[p] = 0;
time[p] = 0;
int size, j, next, nextlength, nexttime, min;
for(i = 1; i < n; i++)
{
size = v[p].size();
for(j = 0; j < size; j++)
{
next = v[p][j].next;
if(mark[next] == 1)
{
continue;
}
nextlength = length[p] + v[p][j].length;
nexttime = time[p] + v[p][j].time;
if(length[next] == -1 || length[next] > nextlength || (length[next] == nextlength && (time[next] == -1 || time[next] > nexttime)))
{
length[next] = nextlength;
time[next] = nexttime;
path1[next] = path1[p];
path1[next].push_back(next);
}
}
min = 100000000;
for(j = 0; j < n; j++)
{
if(length[j] == -1 || mark[j] == 1)
{
continue;
}
if(length[j] < min)
{
min = length[j];
p = j;
}
}
if(p == end)
{
break;
}
mark[p] = 1;
}
int intersections[510];
vector<int> path2[510];
memset(mark, 0, sizeof(mark));
memset(time, -1, sizeof(time));
memset(intersections, -1, sizeof(intersections));
p = begin;
mark[p] = 1;
time[p] = 0;
intersections[p] = 0;
path2[p].push_back(p);
int nextintersections;
for(i = 1; i < n; i++)
{
size = v[p].size();
for(j = 0; j < size; j++)
{
next = v[p][j].next;
if(mark[next] == 1)
{
continue;
}
nexttime = time[p] + v[p][j].time;
nextintersections = intersections[p] + 1;
if(time[next] == -1 || time[next] > nexttime || (time[next] == nexttime && (intersections[next] == -1 || intersections[next] > nextintersections)))
{
time[next] = nexttime;
intersections[next] = nextintersections;
path2[next] = path2[p];
path2[next].push_back(next);
}
}
min = 100000000;
for(j = 0; j < n; j++)
{
if(time[j] == -1 || mark[j] == 1)
{
continue;
}
if(time[j] < min)
{
min = time[j];
p = j;
}
}
if(p == end)
{
break;
}
mark[p] = 1;
}
if(path1[end] == path2[end])
{
printf("Distance = %d; Time = %d: ", length[end], time[end]);
print(path1[end]);
}
else
{
printf("Distance = %d: ", length[end]);
print(path1[end]);
printf("Time = %d: ", time[end]);
print(path2[end]);
}
system("pause");
return 0;
}