#include <bits/stdc++.h> using namespace std; const int N = 1010; int dist[N]; // 每个点到s的距离 int value[N]; int g[N][N]; int w[N][N]; // 花费 bool st[N]; int n, m; void dijkstra(int s, int t){ memset(dist, 0x3f, sizeof(dist)); memset(value, 0x3f, sizeof(value)); dist[s] = 0; value[s] = 0; for (int i=1; i<=n; i++){ int tmp = -1; for (int j=1; j<=n; j++){ if (!st[j] && (tmp == -1 || dist[j] <= dist[tmp])){ if (tmp == -1 || value[j] < value[tmp]){ tmp = j; } } } st[tmp] = true; for (int j=1; j<=n; j++){ if (dist[j] > dist[tmp] + g[tmp][j]){ dist[j] = dist[tmp] + g[tmp][j]; value[j] = value[tmp] + w[tmp][j]; } else if (dist[j] == dist[tmp] + g[tmp][j]){ if (value[j] > value[tmp] + w[tmp][j]){ value[j] = value[tmp] + w[tmp][j]; } } } } } int main(){ while (cin >> n >> m){ if (n == 0 && m == 0){ break; } memset(g, 0x3f, sizeof(g)); memset(w, 0x3f, sizeof(w)); for (int i=1; i<=m; i++){ int x, y, d, p; cin >> x >> y >> d >> p; if (g[x][y] > d){ g[x][y] = d; g[y][x] = d; w[x][y] = p; w[y][x] = p; } else if (g[x][y] == d && w[x][y] > p){ g[x][y] = d; g[y][x] = d; w[x][y] = p; w[y][x] = p; } } int s, t; cin >> s >> t; dijkstra(s, t); // for (int i=1; i<=n; i++){ // cout << dist[i] << " "; // } cout << dist[t] << " " << value[t] << endl; } return 0; }