#include "iostream"
#include "stdio.h"
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <string.h>
#include <stack>
#include <ctype.h>
#include <functional>
#include <math.h>
using namespace std;
const int INF=0x7ffffff;
struct E{
int nt,d,p; //邻接点 路径 花费
};
vector<E> edge[1001];
int ds[1001],cs[1001]; //记录最短路径 最少花费
bool mark[1001]; //标记是否属于集合K
int n,m,s,e;
E tmp;
int main(){
//freopen("input.txt","r",stdin);
while(cin>>n>>m && n && m){
for(int i=1;i<=n;i++) edge[i].clear();
while(m--){
int a,b,d,p;
cin>>a>>b>>d>>p;
tmp.d=d;tmp.p=p;
tmp.nt=b;
edge[a].push_back(tmp);
tmp.nt=a;
edge[b].push_back(tmp);
}
cin>>s>>e;
for(int i=1;i<=n;i++)
mark[i]=false,ds[i]=INF,cs[i]=0;
ds[s]=0,mark[s]=true;
int np=s;
for(int i=1;i<n;i++){ //循环n-1次
for(int j=0;j<edge[np].size();j++){
int t=edge[np][j].nt;
int d=edge[np][j].d;
int p=edge[np][j].p;
if(mark[t]) continue;
if(ds[t]==INF || ds[t]>ds[np]+d || ds[t]==ds[np]+d && cs[t]>cs[np]+p ){
ds[t]=ds[np]+d;
cs[t]=cs[np]+p;
}
}
int mi=INF;
for(int j=1;j<=n;j++){
if(mark[j]) continue;
if(ds[j]<mi)
mi=ds[j],np=j;
}
mark[np]=true;
}
cout<<ds[n]<<" "<<cs[n]<<endl;
}
return 0;
}
/**************************************************************
Problem: 1008
User: cust123
Language: C++
Result: Accepted
Time:10 ms
Memory:1552 kb
****************************************************************/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <sstream>
using namespace std;
//1008
const int INF=1001000000;
const int maxn=1e3+10;
int mp_d[maxn][maxn],mp_c[maxn][maxn];
int vis[maxn],dis[maxn],cost[maxn];
int n,m;
void dijkstra(int s){
for(int i=1;i<=n;i++){
dis[i]=mp_d[s][i];
cost[i]=mp_c[s][i];
vis[i]=0;
}
vis[s]=1;dis[s]=0;cost[s]=0;
for(int i=1;i<=n;i++){//循环遍历n个顶点
int min_dis=INF,idx;
for(int j=1;j<=n;j++){//寻找未访问的直接相邻的最短边
if(vis[j]==0&&dis[j]<min_dis){
min_dis=dis[j];
idx=j;
}
}
vis[idx]=1;
for(int k=1;k<=n;k++){
if(dis[k]>dis[idx]+mp_d[idx][k]){
dis[k]=dis[idx]+mp_d[idx][k];
cost[k]=cost[idx]+mp_c[idx][k];
}
else if(dis[k]==dis[idx]+mp_d[idx][k]){
cost[k]=min(cost[idx]+mp_c[idx][k],cost[k]);
}
}
}
}
int main(){
// freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp_d[i][j]=mp_c[i][j]=INF;
while(m--){
int a,b,d,p;
scanf("%d%d%d%d",&a,&b,&d,&p);
mp_d[a][b]=mp_d[b][a]=d;
mp_c[a][b]=mp_c[b][a]=p;
}
int s,e;
scanf("%d %d",&s,&e);
dijkstra(s);
cout<<dis[e]<<" "<<cost[e]<<endl;
}
return 0;
}
/**************************************************************
Problem: 1008
User: cust123
Language: C++
Result: Accepted
Time:20 ms
Memory:9500 kb
****************************************************************/