Go: // Warshall–Floyd Algorithm

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var scanner = bufio.NewScanner(os.Stdin)

const INF = 2000000000

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		n, _ := strconv.Atoi(buf[0])
		m, _ := strconv.Atoi(buf[1])
		if n == 0 && m == 0 {
			break
		}
		c_matrix := make([][]int, m)
		for i := range c_matrix {
			c_matrix[i] = make([]int, m)
		}
		t_matrix := make([][]int, m)
		for i := range t_matrix {
			t_matrix[i] = make([]int, m)
		}
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf_ := strings.Split(scanner.Text(), " ")
			a, _ := strconv.Atoi(buf_[0])
			b, _ := strconv.Atoi(buf_[1])
			c, _ := strconv.Atoi(buf_[2])
			t, _ := strconv.Atoi(buf_[3])
			c_matrix[a-1][b-1] = c
			t_matrix[a-1][b-1] = t
		}
		c_dist := make([][]int, m)
		c_prev := make([][]int, m)
		t_dist := make([][]int, m)
		t_prev := make([][]int, m)
		for i := 0; i < m; i++ {
			c_dist[i] = make([]int, m)
			c_prev[i] = make([]int, m)
			t_dist[i] = make([]int, m)
			t_prev[i] = make([]int, m)
		}
		for i := 0; i < m; i++ {
			for j := 0; j < m; j++ {
				if c_matrix[i][j] == 0 {
					c_dist[i][j] = INF
					c_prev[i][j] = -1
				} else {
					c_dist[i][j] = c_matrix[i][j]
					c_prev[i][j] = i
				}
				if t_matrix[i][j] == 0 {
					t_dist[i][j] = INF
					t_prev[i][j] = -1
				} else {
					t_dist[i][j] = t_matrix[i][j]
					t_prev[i][j] = i
				}
			}
			c_dist[i][i] = 0
			t_dist[i][i] = 0
		}
		for k := 0; k < m; k++ {
			for i := 0; i < m; i++ {
				for j := 0; j < m; j++ {
					c_newlen := c_dist[i][k] + c_dist[k][j]
					if c_newlen < c_dist[i][j] {
						c_dist[i][j] = c_newlen
						c_prev[i][j] = c_prev[k][j]
					}
				}
			}
		}
		for k := 0; k < m; k++ {
			for i := 0; i < m; i++ {
				for j := 0; j < m; j++ {
					t_newlen := t_dist[i][k] + t_dist[k][j]
					if t_newlen < t_dist[i][j] {
						t_dist[i][j] = t_newlen
						t_prev[i][j] = t_prev[k][j]
					}

				}
			}
		}
		scanner.Scan()
		k, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < k; i++ {
			scanner.Scan()
			buf_ := strings.Split(scanner.Text(), " ")
			p, _ := strconv.Atoi(buf_[0])
			q, _ := strconv.Atoi(buf_[1])
			r, _ := strconv.Atoi(buf_[2])
			switch r {
			case 0:
				fmt.Println(c_dist[p-1][q-1])
			case 1:
				fmt.Println(t_dist[p-1][q-1])
			}
		}
	}
}

C++: #include <bits/stdc++.h>

using namespace std;

#define MAX 110
#define INF (1<<29)

int main()
{
    int M, N;
    while (cin >> M >> N, M) {
        int co[MAX][MAX];
        int ti[MAX][MAX];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                co[i][j] = ti[i][j] = INF;                
            }
            co[i][i] = ti[i][i] = 0;
        }
        int a, b, c, t;
        for (int i = 0; i < M; i++) {
            cin >> a >> b >> c >> t;
            a--; b--;
            
            co[a][b] = co[b][a] = c;
            ti[a][b] = ti[b][a] = t;            
        }

        for (int k = 0; k < N; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    co[i][j] = min(co[i][j], co[i][k] + co[k][j]);
                    ti[i][j] = min(ti[i][j], ti[i][k] + ti[k][j]);
                }
            }
        }

        int Q, r;
        cin >> Q;
        while (Q--) {
            cin >> a >> b >> r;
            a--; b--;
            if (r == 0) {
                cout << co[a][b] << endl;
            } else {
                cout << ti[a][b] << endl;
            }
        }
    }
    return 0;
}

C++: #include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
#include <utility>
using namespace std;

typedef pair<int,int> P;

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define mp make_pair
#define pb push_back

struct edge {
  int to, cost, time;
  edge(int a, int b, int c): to(a), cost(b), time(c) {}
};

const int MAX_M = 100, INF = 10000000;
int n, m;

vector<edge> E[MAX_M+1];

void solve() {
  rep(i,MAX_M+1) E[i].clear();
  
  rep(i,n) {
    int a, b, cost, time; cin>>a>>b>>cost>>time;
    E[a].push_back(edge(b, cost, time));
    E[b].push_back(edge(a, cost, time));
  }
  int zz; cin>>zz;
  rep(z,zz) {
    int p, q, r; cin>>p>>q>>r;
    // dijkstra
    int d[MAX_M+1];
    fill(d, d+MAX_M+1, INF);
    priority_queue<P, vector<P>, greater<P> > que;
    que.push(P(0, p));
    d[p] = 0;
    while (!que.empty()) {
      P p = que.top(); que.pop();
      int td = p.first, ti = p.second;
      if (d[ti] < td) continue;
      rep(i,E[ti].size()) {
        edge e = E[ti][i];
        if (r == 0) {
          if (d[e.to] > d[ti] + e.cost) {
            d[e.to] = d[ti] + e.cost;
            que.push(P(d[e.to], e.to));
          } 
        } else {
          if (d[e.to] > d[ti] + e.time) {
            d[e.to] = d[ti] + e.time;
            que.push(P(d[e.to], e.to));
          }
        }
      }
    }
    cout<<d[q]<<endl;
  }
}

int main (int argc, char const* argv[]) {
  while (cin>>n>>m, n||m) {
    solve();
  }
  return 0;
}

C++: #include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define INF 114514



int main(){
	int lineL, statL;
	cin >> lineL >> statL;
	long leastCosts[statL][statL];
	long leastTimes[statL][statL];
	FOR(aStat,0,statL){
		FOR(bStat,0,statL){
			if(aStat==bStat){
				leastCosts[aStat][bStat] = 0;
				leastTimes[aStat][bStat] = 0;
			}else{
				leastCosts[aStat][bStat] = INF;
				leastTimes[aStat][bStat] = INF;
			}
		}
	}

	REP(lineI,lineL){
		int naStat,nbStat,nCost,nTime;
		cin >> naStat >> nbStat >> nCost >> nTime;
		naStat -=1; nbStat -=1;
		FOR(aStat,0,statL){
			FOR(bStat,0,statL){
				leastCosts[aStat][bStat] = min(leastCosts[aStat][bStat] , leastCosts[aStat][naStat]+nCost+leastCosts[nbStat][bStat]);
				leastCosts[aStat][bStat] = min(leastCosts[aStat][bStat] , leastCosts[aStat][nbStat]+nCost+leastCosts[naStat][bStat]);
				leastTimes[aStat][bStat] = min(leastTimes[aStat][bStat] , leastTimes[aStat][naStat]+nTime+leastTimes[nbStat][bStat]);
				leastTimes[aStat][bStat] = min(leastTimes[aStat][bStat] , leastTimes[aStat][nbStat]+nTime+leastTimes[naStat][bStat]);
			}
		}
	}

	int reqL;
	cin >> reqL;
	REP(reqI,reqL){
		int aStat,bStat,costOrTime;
		cin >> aStat >> bStat >> costOrTime;
		aStat-=1;bStat-=1;
		if(costOrTime==0){cout<<leastCosts[aStat][bStat]<<endl;};
		if(costOrTime==1){cout<<leastTimes[aStat][bStat]<<endl;};
	}

	return 0;
}