#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;
}
}