#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define INF 1<<30
using std::vector;
int n,m,graph[2][1001][1001],s,t,D[1001],P[1001];
bool visited[1001];
//vector<int> p[1001];
void Dijkstra()
{
int i,j;
//visited[s]=1;
for(i=1;i<=n;i++)
{
D[i]=INF;
P[i]=INF;
}
P[s]=0;
D[s]=0;
for(j=1;j<=n;j++)
{
int min=INF;
int k=-1;
for(i=1;i<=n;i++)
{
if(visited[i]==0&&min>D[i])
{
min=D[i];
k=i;
}
}
if(k!=-1)
{
visited[k]=1;
for(i=1;i<=n;i++)
{
if(visited[i]==0&&D[i]>=D[k]+graph[0][k][i])
{
if(D[i]>D[k]+graph[0][k][i])
{
D[i]=D[k]+graph[0][k][i];
P[i]=P[k]+graph[1][k][i];
//printf("%d %d %d\n",i,D[type][i],P[i]);
}
else if(D[i]==D[k]+graph[0][k][i]&&P[i]>P[k]+graph[1][k][i])
{
P[i]=P[k]+graph[1][k][i];
}
}
}
}
}
}
int main()
{
int i,j;
//printf("%d\n",INF);
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
else{
int a,d,b,p1;
memset(visited,0,sizeof(visited));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
{
graph[0][i][j]=0;
graph[1][i][j]=0;
}
else
{
graph[0][i][j]=INF;
graph[1][i][j]=INF;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p1);
graph[0][a][b]=d;
graph[0][b][a]=d;
graph[1][a][b]=p1;
graph[1][b][a]=p1;
}
scanf("%d%d",&s,&t);
Dijkstra();
printf("%d %d\n",D[t],P[t]);
}
}
}
/**************************************************************
Problem: 1008
User: th是個小屁孩
Language: C++
Result: Accepted
Time:20 ms
Memory:9356 kb
****************************************************************/