#include<iostream>
#include<queue>

#define inf 1000000000

using namespace std;

int C[101][101],T[101][101];
	int n,m;

class sint{
	public:
	int n,m;
	sint(){}
	sint(int a,int b){n=a;m=b;}
	bool operator <(const sint &a) const{
		return m>a.m;
	}
};

int dike(int st,int en,int va){
	priority_queue<sint> state;
	
	int visit[101];
	int now[101];
	for(int i=0;i<101;i++){
		visit[i]=0;
		now[i]=inf;
	}
	
	state.push(sint(st,0));
	now[st]=0;
	
	while(1){
		sint u;
		u=state.top();
		state.pop();
		visit[u.n]=1;
		/*
		printf("come %d %d\n",u.n,u.m);
		for(int i=1;i<=m;i++){
			printf("%4d",now[i]);
		}
		puts("");
		for(int i=1;i<=m;i++){
			printf("%4d",visit[i]);
		}puts("");
		*/if(u.n==en){
			return u.m;
		}
		
		
		for(int i=1;i<=m;i++){
			int cost=C[u.n][i];
			if(va==1){
				cost=T[u.n][i];
			}
			if(cost==inf||visit[i]==1){
				continue;
			}
			if(cost+u.m < now[i]){
				now[i]=cost+u.m;
				state.push(sint(i,now[i]));
			}
		}
	}
}

int main(){
	
	while(1){
		cin>>n>>m;
		if(n==0){
			break;
		}
		for(int i=0;i<101;i++){
			for(int j=0;j<101;j++){
				C[i][j]=T[i][j]=inf;
			}
		}
		
		for(int i=0;i<n;i++){
			int a,b,c,d;
			cin>>a>>b>>c>>d;
			C[a][b]=C[b][a]=c;
			T[a][b]=T[b][a]=d;
		}
		
		int l;
		cin>>l;
		
		for(int i=0;i<l;i++){
			int a,b,c;
			cin>>a>>b>>c;
			printf("%d\n",dike(a,b,c));
		}
	}
}