#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1010
#define inf 0x3fffffff
using namespace std;
int cost[maxn][maxn],G[maxn][maxn];
int n,m,d[maxn],c[maxn],vis[maxn];
int st,ed;
void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
d[i]=inf;
c[i]=inf;
}
d[s]=0;
c[s]=0;
int MIN;
int u;
for(int i=1;i<=n;i++)
{
MIN=inf;
u=-1;
for(int j=1;j<=n;j++)
{
if(MIN>d[j]&&vis[j]==0)
{
MIN=d[j];
u=j;
}
}
if(u==-1)
break;
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(d[j]>d[u]+G[u][j]||(d[u]+G[u][j]==d[j]&&c[j]>c[u]+cost[u][j]))
{
d[j]=d[u]+G[u][j];
c[j]=c[u]+cost[u][j];
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
G[i][j]=inf;
cost[i][j]=inf;
}
}
for(int i=0;i<m;i++)
{
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
if(G[a][b]>c||(G[a][b]==c&&cost[a][b]>d))
{
G[a][b]=G[b][a]=c;
cost[a][b]=cost[b][a]=d;
}
}
scanf("%d %d",&st,&ed);
dijkstra(st);
printf("%d %d\n",d[ed],c[ed]);
}
return 0;
}