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 PHP (judge verdict: Time Limit Exceeded)

<?php
//ダイクストラ法
//WA。確定距離の値を再利用するのが難しい


$file_handle = fopen('php://stdin', "r");
//$file_handle = fopen('aoj0200_in.txt', "r");

/*--------------------
$map[$a][$b] = $cost;	//マップ情報
$marked = $node;	//探索候補
$fixed[$start][$b] = boolean;	//確定最短経路
$distance[$start][$b] = $cost;	//仮確定距離
--------------------*/

//【コスト】スタート地点からたどる
function dijkstra_cost($start, $goal){
	global $m, $c, $c_distance, $c_fixed;
	
	//初期化
	$c_fixed = array();
	
	//出発地点までの距離を０
	$c_distance[$start][$start] = 0;
	
	while(1){
		//終了条件
		if (isset($c_fixed[$start][$goal])) break;
	
		$marked = minIndex($c_distance, $c_fixed, $start);
		//print_r($marked);
		if ($marked === -1) break;
		//コスト確定フラグを立てる
		$c_fixed[$start][$marked] = $c_fixed[$marked][$start] = true;
		//隣接する都市$iについて
		for ($i=1; $i<=$m; $i++){
			if (isset($c[$marked][$i]) && !isset($c_fixed[$start][$i]) ){
				//経路が存在し、未確定ならば$markedを経由した距離を求める
				$newDistance = $c_distance[$start][$marked] + $c[$marked][$i];
				//今までの距離よりも小さければ書き換える
				if ($newDistance < $c_distance[$start][$i]) 
					$c_distance[$start][$i] = $c_distance[$i][$start] = $newDistance;
			}
		}
	}
}

//【時間】スタート地点からたどる
function dijkstra_time($start, $goal){
	global $m, $t, $t_distance, $t_fixed;

	//初期化
	$t_fixed = array();

	//出発地点までの距離を０
	$t_distance[$start][$start] = 0;
	
	while(1){
		//終了条件
		if (isset($t_fixed[$start][$goal])) break;
		
		$marked = minIndex($t_distance, $t_fixed, $start);
		if ($marked === -1) break;
		//コスト確定フラグを立てる
		$t_fixed[$start][$marked] = $t_fixed[$marked][$start] = true;
		//隣接する都市$iについて
		for ($i=1; $i<=$m; $i++){
			if (isset($t[$marked][$i]) && !isset($t_fixed[$start][$i])){
				//経路が存在し、未確定ならば$markedを経由した距離を求める
				$newDistance = $t_distance[$start][$marked] + $t[$marked][$i];
				//今までの距離よりも小さければ書き換える
				if ($newDistance < $t_distance[$start][$i]) 
					$t_distance[$start][$i] = $t_distance[$i][$start] = $newDistance;
			}
		}
	}
}


// 距離が未確定のノードの中で、最もスタート地点からの距離が小さいものを探す
function minIndex($distance, $fixed, $start){
	global $m;
	
	for ($idx=1; $idx<=$m; $idx++){
		if (!isset($fixed[$start][$idx])) break;
	}
	if ($idx === $m+1) return -1;
	for ($i=$idx+1; $i<=$m; $i++){
		//距離が小さければノード番号を書き換えるの繰り返し
		if (!isset($fixed[$start][$i]) && $distance[$start][$i] < $distance[$start][$idx]) $idx = $i;
	}
	return $idx;
}



while (1){
	//変数の初期化

	//ファイル読み込み
	$info = fscanf($file_handle, '%d %d');
	$n = $info[0]; $m = $info[1];
	//終了条件
	if ($n === 0 && $m === 0){
		break;
	}
	

	//各都市について初期化
	for ($i=1; $i<=$m; $i++){
		for ($j=1; $j<=$m; $j++){
			$c_distance[$i][$j] = INF;  $t_distance[$i][$j] = INF;
		}
	}

	//マップ情報
	for ($i=1; $i<=$n; ++$i){
		$info2 = fscanf($file_handle, '%d %d %d %d');
		$a = $info2[0]; $b = $info2[1]; $cost = $info2[2]; $time = $info2[3];
		//情報を格納。
		$c[$a][$b] = $c[$b][$a] = $cost;
		$t[$a][$b] = $t[$b][$a] = $time;
	}
	
	//ファイル読み込み続き
	$k = trim(fgets($file_handle));
	for ($i=1; $i<=$k; $i++){
		$info3 = fscanf($file_handle, '%d %d %d');
		$p = $info3[0]; $q = $info3[1]; $r = $info3[2];
		if ($r === 0){
			if (!isset($c_fixed[$p][$q])){
				//探索
				dijkstra_cost($p, $q);
				echo $c_distance[$p][$q];		//出力
			} else {
				echo $c_distance[$p][$q];
			}
		} else {
			if (!isset($t_fixed[$p][$q])){
				dijkstra_time($p, $q);
				echo $t_distance[$p][$q];
			} else {
				echo $t_distance[$p][$q];
			}
		}
		echo PHP_EOL;
	}
}

fclose($file_handle);