#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;
const int MAX =1000;
const int INF =0x3f3f3f;
int m,n;
int lowdis[MAX];
int lowval[MAX];
int cost[MAX][MAX];
int vis[MAX];
int map[MAX][MAX];
void dijkstra(int st){
int temp=0;
for(int i=1;i<=n;i++)
{
lowdis[i]=map[st][i];
lowdis[st]=0;
lowval[i]=cost[st][i];
lowval[st]=0;
}
vis[st]=true;
for(int i=1;i<n;i++){
int MIN=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&lowdis[j]<MIN){
temp=j;
MIN=lowdis[j];
}
}
vis[temp]=true;
for(int j=1;j<=n;j++){
if(map[temp][j]<INF&&!vis[j]){
if(lowdis[j]>lowdis[temp]+map[temp][j]){
lowdis[j]=lowdis[temp]+map[temp][j];
lowval[j]=lowval[temp]+cost[temp][j];
}
else if(lowdis[j]==lowdis[temp]+map[temp][j])
if(lowval[j]>lowval[temp]+cost[temp][j])
lowval[j]=lowval[temp]+cost[temp][j];
}
}
}
}
int main()
{
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++){
cost[i][j]=INF;
map[i][j]=INF;
}
memset(vis, false, sizeof vis);
while(cin>>n>>m&&m&&n){
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
int val,dis;
cin>>dis;
map[x][y]=map[y][x]=dis;
cin>>val;
cost[x][y]=cost[y][x]=val;
}
int start,end;
cin>>start>>end;
dijkstra(start);
for(int i=1;i<=n;i++){
cout<<setw(5)<<"到达第"<<i<<" 个点的距离为";
cout<<setw(5)<<lowdis[i]<<" 价值为 "<<lowval[i]<<endl;
}
}
}
没啥好说的,在最短路的基础上加了求最小花费,当两路径距离相同时判断花费!