1 #include<stdio.h>
2 #include<string.h>
3 #define MAXN 502
4 #define INF 0x3fffffff
5 int n,m,s,d;
6 int g[MAXN][MAXN],vis[MAXN],weight[MAXN][MAXN],dist[MAXN],w[MAXN];
7 void read();
8 void Dijkstra(int s);
9 int main(){
10 read();
11 Dijkstra(s);
12 if(dist[d]!=INF) printf("%d %d",dist[d],w[d]);
13 return 0;
14 }
15 void read(){
16 scanf("%d %d %d %d",&n,&m,&s,&d);
17 int i,j,v1,v2,d1,w1;
18 for(i=0;i<n;i++)
19 for(j=0;j<n;j++)
20 {
21 g[i][j] = INF;
22 weight[i][j] = INF;
23 }
24 for(i=0;i<m;i++){
25 scanf("%d %d %d %d",&v1,&v2,&d1,&w1);
26 g[v1][v2] = d1;
27 g[v2][v1] = d1;
28 weight[v1][v2] = w1;
29 weight[v2][v1] = w1;
30 }
31 }
32 void Dijkstra(int s){
33 int i,j;
34 for(i=0;i<n;i++) {
35 dist[i] = INF;
36 vis[i] = 0;
37 }
38 dist[s] = 0;
39 while(1){
40 int min=INF,mindex=-1;
41 for(i=0;i<n;i++){
42 if(dist[i]<min&&vis[i]==0){
43 min = dist[i];
44 mindex = i;
45 }
46 }
47 if(mindex==-1) break;
48 vis[mindex] = 1;
49 for(i=0;i<n;i++){
50 if(g[mindex][i]!=INF&&vis[i]==0&&i!=mindex){
51 if(dist[mindex]+g[mindex][i]<dist[i]){
52 dist[i] = dist[mindex] + g[mindex][i];
53 w[i] = w[mindex] + weight[mindex][i];
54 }
55 else if(dist[mindex]+g[mindex][i]==dist[i]){
56 if(w[mindex]+weight[mindex][i]<w[i]){
57 w[i] = w[mindex]+weight[mindex][i];
58 }
59 }
60 }
61 }
62 }
63 }