//用dij方法做,最简单。注意:可能有重边的情况
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1005 const int inf=1<<29; int vis[N], w[N][N],c[N][N]; int d[N],f[N]; int n,m; void dij(int st,int ed) { int i,j; for(i=1; i<=n; i++) { d[i]=w[st][i]; f[i]=c[st][i]; } d[st]=f[st]=0; vis[st]=1; for(i=1; i<=n; i++) { int dmin=inf,fmin=inf,x; for(j=1; j<=n; j++) { if(!vis[j]&&d[j]<dmin) { dmin=d[j]; fmin=f[j]; x=j; } else if(!vis[j]&&d[j]==dmin&&f[j]<fmin) { dmin=d[j]; fmin=f[j]; x=j; } } vis[x]=1; for(j=1; j<=n; j++) { if(!vis[j]&&d[j]>d[x]+w[x][j]) { d[j]=d[x]+w[x][j]; f[j]=f[x]+c[x][j]; } else if(!vis[j]&&d[j]==d[x]+w[x][j]&&f[j]>f[x]+c[x][j]) { d[j]=d[x]+w[x][j]; f[j]=f[x]+c[x][j]; } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF&&(m+n)) { int i,j; memset(vis,0,sizeof(vis)); for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(i==j) { w[i][j]=0; } else { w[i][j]=inf; } } } int u,v,c1,c2; while(m--) { scanf("%d%d%d%d",&u,&v,&c1,&c2); if(c1<w[u][v]) { w[u][v]=w[v][u]=c1; c[u][v]=c[v][u]=c2; } else if(c1==w[u][v]&&c2<c[u][v]) { w[u][v]=w[v][u]=c1; c[u][v]=c[v][u]=c2; } } int a,b; scanf("%d%d",&a,&b); dij(a,b); printf("%d %d\n",d[b],f[b]); } return 0; }