#include <iostream>
#include <queue>
using namespace std;
struct Line{
	int a;
	int b;
	int cost;
	int time;
};
int Min(int x,int y){
	return x<y?x:y;
}
#define Max 2000000000
int main(){
	int N,M;
	while(true){
		Line lines[3000];
		cin >> N >>M;
		if(N+M==0)	break;
		for(int i=0 ; i<N ; i++ ){
			cin >> lines[i].a >> lines[i].b ;
			cin >> lines[i].cost >> lines[i].time;
		}
		int K;
		cin >> K;
		for(int i=0 ; i<K ; i++ ){
			int to,from,r;
			cin >> from >> to>>r;
			queue <int> circle;
			circle.push(from);
			int dp[3000];
			for(int i=0 ; i<=M ; i++ )
				dp[i]=Max;
			dp[from]=0;
			while(circle.size()!=0){
				int now=circle.front();
				for(int i=0 ; i<N ; i++ ){
					if(now==lines[i].a){
						int next=lines[i].b;
						if(!r)
							dp[next]=Min(dp[next],dp[now]+lines[i].cost);
						else
							dp[next]=Min(dp[next],dp[now]+lines[i].time);
						circle.push(lines[i].b);
					}
				}
				circle.pop();
			}
			cout << dp[to] << endl;
		}
	}
	return 0;
}
	

