#include <iostream> #include <utility> #include <cstring> using namespace std; #define mm memset typedef pair<int ,int> pii; pii m1[1000][1000]; bool visited[1000]; int numsd[1000]; // initial =inf int numspre[1000]; // previous path int numsc[1000]; // const int INF = 0x3f3f3f3f; void dijkstra(int s , int e1) { mm(numsd,0x3f,sizeof(numsd)); mm(numsc,0x3f,sizeof(numsc)); mm(visited,0,sizeof(visited)); numsd[s] = 0; numspre[s] = s; numsc[s] = 0; while (visited[e1] == false) { int tmpd = INF, tmpi; for(int i= 0; i< 1000 ;++i) { if(visited[i] == false && numsd[i] < tmpd) { tmpd = numsd[i]; tmpi =i; } } visited[tmpi] = true; // if(tmpi == e1) return; for(int i = 0; i< 1000 ; ++i) { if(visited[i]==false && ( (numsd[i] > numsd[tmpi] +m1[tmpi][i].first) || (numsd[i] == numsd[tmpi] +m1[tmpi][i].first && numsc[i] > numsc[tmpi] +m1[tmpi][i].second) ) ) { numsd[i] = numsd[tmpi] +m1[tmpi][i].first; // numspre[i] = tmpi; numsc[i] = numsc[tmpi] +m1[tmpi][i].second; } } } } // int fcount(int s,int e1) // { // if(s == e1) return 0; // return m1[e1][numspre[e1]].second + fcount(s,numspre[e1]); // } int main() { int n ,m; while (cin>> n >>m) { if( n== 0) break; int a ,b ,d ,p,s, e1; mm(m1,0x3f,sizeof(m1)); for(int i= 0 ;i< m ;++ i) { cin >>a >>b>>d >>p; if(d < m1[a-1][b-1].first || (d ==m1[a-1][b-1].first && m1[a-1][b-1].second > p)) { m1[a-1][b-1] = m1[b-1][a-1] ={d,p}; } } cin>> s >>e1; dijkstra(s-1,e1-1); cout<< numsd[e1-1]<<" "<<numsc[e1-1]<<endl; } }