Problem:
青春の片道切符

太郎君は夏休みに電車で長旅をする計画を立てています。しかし高校生の身である太郎君が一ヵ月しかない夏休みで可能な限り遠くに旅をするには、出来るだけ安い行き方と出来るだけ早い行き方をそれぞれ見つけなければうまく計画が立てられません。太郎君が素敵な旅を満喫できるように、太郎君の計画の助けになるプログラムを作ってあげましょう。

線路の情報、駅の数を入力とし、問い合わせに応じて、最小金額または最短時間を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。

n m
a1 b1 cost1 time1
a2 b2 cost2 time2
:
an bn costn timen
k
p1 q1 r1
p2 q2 r2
:
pk qk rk

1 行目に線路の情報の数 n (1 ≤ n ≤ 3000)と駅の数 m (1 ≤ m ≤ 100) が与えられます。

続く n 行に i 番目の路線の情報が与えられます。各路線の情報として、路線がつなぐ２つの駅の番号 ai, bi (1 ≤ ai, bi ≤ m)、料金 costi (1 ≤ costi ≤ 1000)、移動時間 timei (1 ≤ timei ≤ 1000) が与えられます。ただし、各駅は 1 から m まで順番に番号が付けられているものとします。
なお、ai と bi が線路でつながっていれば、ai から bi、 bi からai の両方の移動が同じ料金と時間で可能とします。

続く行に問い合わせの数 k (1 ≤ k ≤ 200) が与えられます。続く k 行に i 番目の問い合わせが与えられます。各問合わせとして、出発駅 pi 、到着駅 qi 、出力する値の種類 ri (0 または 1)が与えられます。なお、問い合わせには必ず経路があるものとします。

データセットの数は 50 を超えない。

Output

データセットごとに、最小金額もしくは最短時間を１行に出力します。ri が 0 の時は最小金額を、 1 の時は最短時間を出力します。

Sample Input

6 5
1 2 200 10
1 4 400 15
1 3 250 25
2 4 100 10
4 5 150 20
3 5 300 20
2
1 5 0
1 5 1
0 0

Output for the Sample Input

450
35

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AOJ.Volume2
{
    public class TravelingAlone
    {
        private static int station_cnt;
        private static int[,] price;
        private static int[,] time;

        private struct Station
        {
            public int No;
            public int Cost;
            public bool Confirm;
        }
        private static Station[] dp;

        private static int Solve(int start, int goal, int kind)
        {
            // ダイクストラ法で最短経路を求める
            dp[start].Cost = 0;
            dp[start].Confirm = true;

            int current = start;
            while (true)
            {
                int min_cost = int.MaxValue;
                int min_no = 0;
                for (int i = 1; i <= station_cnt; i++)
                {
                    if (dp[i].Confirm) { continue; }

                    int c = 0;
                    // kind == 0の場合は金額計算それ以外は時間を計算
                    if (kind == 0) { c = price[current, i]; }
                    else { c = time[current, i]; }

                    if (c > 0)
                    {
                        if (dp[i].Cost < 0) { dp[i].Cost = dp[current].Cost + c; }
                        else { dp[i].Cost = Math.Min(dp[i].Cost, dp[current].Cost + c); }
                    }

                    if (min_cost > dp[i].Cost)
                    {
                        min_cost = dp[i].Cost;
                        min_no = dp[i].No;
                    }
                }
                // Costが最小のものを確定させてQueueに追加
                if (min_no > 0)
                {
                    dp[min_no].Confirm = true;
                    if (min_no == goal) { return min_cost; }
                    else { current = min_no; }
                }
                else { break; }
            }

            // ここに到達した場合は経路なし
            return -1;
        }

        public static int Main()
        {
            while (true)
            {
                var n_m = Console.ReadLine().Split(' ');
                int rail_cnt = int.Parse(n_m[0]);
                station_cnt = int.Parse(n_m[1]);
                if (rail_cnt == 0 && station_cnt == 0) { break; }

                // 金額、移動時間の情報
                price = new int[station_cnt + 1, station_cnt + 1];
                time = new int[station_cnt + 1, station_cnt + 1];
                for (int i = 0; i < rail_cnt; i++)
                {
                    var input = Console.ReadLine().Split(' ');
                    int from = int.Parse(input[0]);
                    int to = int.Parse(input[1]);
                    int p = int.Parse(input[2]);
                    int t = int.Parse(input[3]);

                    price[from, to] = p;
                    time[from, to] = t;
                    // fromとtoを逆にした情報も
                    price[to, from] = p;
                    time[to, from] = t;
                }

                // 問い合わせの数
                int q = int.Parse(Console.ReadLine());
                for (int i = 0; i < q; i++)
                {
                    var input = Console.ReadLine().Split(' ');
                    int start = int.Parse(input[0]);
                    int goal = int.Parse(input[1]);
                    int kind = int.Parse(input[2]);

                    // 最短距離計算
                    dp = new Station[station_cnt + 1];
                    for (int j = 1; j <= station_cnt; j++)
                    {
                        dp[j].No = j;
                        dp[j].Cost = -1;
                        dp[j].Confirm = false;
                    }

                    int answer = Solve(start, goal, kind);
                    Console.WriteLine(answer);
                }
            }
            return 0;
        }
    }
}