#include <iostream>
const int MAX_E = 300, MAX_V = 100, INF = 1000000;
struct edge{int from, to, time, cost;};

edge es[MAX_E];
int d[MAX_V+1];
int n, m, k;

//0: time 1: cost
int minimum_value(int type, int start, int end){
	for(int i=0;i<MAX_V;i++)d[i] = INF;
	d[start] = 0;

	int res = 0;
	while(true){
		bool update = false;
		for(int i=0;i<n;i++){
			edge e = es[i];
			int cost = type?e.cost:e.time;
			if(d[e.from] != INF && d[e.to] > d[e.from] + cost){
				d[e.to] = d[e.from] + cost;
				res = d[e.to];
				update = true;
			}		
		}
		if(!update)break;
	}

	return res;
}

int main(){
	while(std::cin >> n >> m, n){
		for(int i=0;i<n;i++){
			int from, to, time, cost;
			std::cin >> from >> to >> time >> cost;
			edge e;
			e.from = from, e.to = to, e.time = time, e.cost = cost;
			es[i] = e;
		}

		std::cin >> k;
		for(int j=0;j<k;j++){
			int start, end, type;
			std::cin >> start >> end >> type;
			std::cout << minimum_value(type, start, end) << std::endl;
		}
	}

	return 0;
}