#include<iostream>
#define INF 501
using namespace std;
bool visited[501]={false};
int vdist[501],vcost[501];
int dist[501][501],cost[501][501];
void dijstra(int s,int d,int n){
vdist[s]=0;visited[s]=true;
for(int i=0;i<n;i++){ //剩余n-1个节点 ,所以n-1次循环
//找出未被访问且距离最短的点
int mindist=INF;
int minvertex;
for(int j=0;j<n;j++){
if(!visited[j] && vdist[j]<mindist){
mindist=vdist[j];
minvertex=j;
}
}
//标记为访问过
visited[minvertex]=true;
//更新周围节点
for(int j=0;j<n;j++){
if(!visited[j] && vdist[minvertex]+dist[minvertex][j]<vdist[j]){
vdist[j]=vdist[minvertex]+dist[minvertex][j];
vcost[j]=vcost[minvertex]+cost[minvertex][j];
}else if(!visited[j] && vdist[minvertex]+dist[minvertex][j]==vdist[j] && vcost[minvertex]+cost[minvertex][j]<vcost[j]){
vcost[j]=vcost[minvertex]+cost[minvertex][j];
}
}
}
}
int main(){
//freopen("input.txt","r",stdin);
int v,e,s,d,v1,v2,curdist,curcost,i,j;
cin>>v>>e>>s>>d;
//1、初始化
for(i=0;i<v;i++){
for(j=0;j<v;j++){
dist[i][j]=dist[j][i]=INF;
cost[i][j]=cost[j][i]=INF;
}
}
//2、
for(i=0;i<e;i++){
cin>>v1>>v2>>curdist>>curcost;
dist[v1][v2]=dist[v2][v1]=curdist;
cost[v1][v2]=cost[v2][v1]=curcost;
}
//3、
for(i=0;i<v;i++){
vdist[i]=dist[i][s];
vcost[i]=cost[i][s];
}
//4、
dijstra(s,d,v);//s源点,d终点,v顶点数
cout<<vdist[d]<<" "<<vcost[d]<<endl;
return 0;
}