#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct Road{
int d;
int p;
}Road;
Road road[1005][1005];
#define INF 0xfffffff
int n,m;
void dij(int s,int t)
{
bool visited[1005];
int dis[1005];
int price[1005];
for(int i=1;i<=n;i++)
{
visited[i]=false;
dis[i]=road[s][i].d;
price[i]=road[s][i].p;
}
visited[s]=true;
dis[s]=0;
price[s]=0;
for(i=1;i<n;i++)
{
int min=INF;
int node=0;
for(int j=1;j<=n;j++)
{
if(!visited[j]&&dis[j]<min)
{
min=dis[j];
node=j;
}
}
visited[node]=true;
for(j=1;j<=n;j++)
{
if(!visited[j]&&dis[j]>min+road[node][j].d)
{
dis[j]=min+road[node][j].d;
price[j]=price[node]+road[node][j].p;
}
else if(!visited[j]&&dis[j]==min+road[node][j].d)
{
if(price[j]>price[node]+road[node][j].p)
price[j]=price[node]+road[node][j].p;
}
}
}
printf("%d %d\n",dis[t],price[t]);
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
int i;
for(i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
road[i][j].d=INF;
road[i][j].p=INF;
}
for(i=1;i<=m;i++)
{
int temp1,temp2,temp3,temp4;
scanf("%d%d%d%d",&temp1,&temp2,&temp3,&temp4);
// cin>>temp1>>temp2>>temp3>>temp4;
if(road[temp1][temp2].d>temp3)
{
road[temp1][temp2].d=road[temp2][temp1].d=temp3;
road[temp1][temp2].p=road[temp2][temp1].p=temp4;
}
else if(road[temp1][temp2].d==temp3)
{
if(road[temp1][temp2].p>temp4)
road[temp1][temp2].p=road[temp2][temp1].p=temp4;
}
}//input is over
int s,t;
scanf("%d%d",&s,&t);
//cin>>s>>t;
dij(s,t);
}
return 0;
}