1 #include <cstdlib>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <cctype>
6
7 #include <iostream>
8 #include <string>
9 #include <vector>
10 #include <list>
11 #include <deque>
12 #include <set>
13 #include <map>
14 #include <stack>
15 #include <queue>
16 #include <algorithm>
17
18 #define MAXN 100001
19 #define MAXD 99999999
20 using namespace std;
21
22
23 struct Node{
24 int d;
25 int p;
26 }g[1001][1001];
27
28 int lowd[1001];
29 int lowp[1001];
30
31 int vis[1001];
32
33
34
35
36
37
38 int main()
39 {
40
41
42 int n,m;
43
44 while(scanf("%d%d",&n,&m)!=EOF)
45 {
46 if((n==0)&&(m==0))
47 break;
48
49
50 int i,j,k;
51
52
53 for(i=1;i<=n;i++)
54 {
55 for(j=1;j<=n;j++)
56 {
57 g[i][j].p=g[i][j].d=MAXD;
58 }
59
60
61 }
62
63
64
65
66
67 for(i=0;i<m;i++)
68 {
69 int a,b,d,p;
70
71 scanf("%d%d%d%d",&a,&b,&d,&p);
72
73
74 if(g[a][b].d>d)
75 {g[a][b].d=g[b][a].d=d;g[a][b].p=g[b][a].p=p;}
76 else if(g[a][b].d==d)
77 {
78 if(g[a][b].p>p)
79 g[a][b].p=g[b][b].p=p;
80 }
81
82
83 }
84
85
86
87 int s,t;
88
89 scanf("%d%d",&s,&t);
90
91
92 for(i=1;i<=n;i++)
93 {
94 lowd[i]=g[s][i].d;
95 lowp[i]=g[s][i].p;
96 vis[i]=0;
97 }
98
99
100 vis[s]=1;
101
102
103 for(i=1;i<n;i++)
104 {
105 int temp=MAXD;
106 int k=-1;
107
108
109 for(j=1;j<=n;j++)
110 {
111 if(vis[j]==0)
112 {
113 if(temp>lowd[j])
114 {k=j;temp=lowd[j];}
115 }
116 }
117
118 if(k==-1)
119 break;
120
121 vis[k]=1;
122
123 if(k==t)
124 break;
125
126 for(j=1;j<=n;j++)
127 {
128 if(vis[j]==0)
129 {
130 if(lowd[j]>lowd[k]+g[k][j].d)
131 {lowd[j]=lowd[k]+g[k][j].d;lowp[j]=lowp[k]+g[k][j].p;}
132 else if(lowd[j]==lowd[k]+g[k][j].d)
133 {
134 if(lowp[j]>lowp[k]+g[k][j].p)
135 {lowp[j]=lowp[k]+g[k][j].p;}
136 }
137 }
138 }
139 }
140
141
142 printf("%d %d\n",lowd[t],lowp[t]);
143 }
144
145
146
147 return 0;
148 }