#include<iostream>
#include<queue>
#include<algorithm>

using namespace std;

#define inf 1000000000

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

class S{
	public:
	int iti,now;
	S(){}
	S(int a,int b){iti=a;now=b;}
	bool operator < (const S &a)const{
		return now>a.now;
	}
};
int dike(int st,int en,int va){
	priority_queue<S> state;
	int sima[101];
	for(int i=0;i<101;i++){
		sima[i]=inf;
	}
	state.push(S(st,0));
	sima[st]=0;
	while(1){
		S u;
		u=state.top();
		state.pop();
		
		if(u.iti==en){
			return u.now;
		}
		
		
		for(int i=1;i<=m;i++){
			
			if(C[u.iti][i]==inf){
				
				continue;
			}
			
			if(u.now+C[u.iti][i] < sima[i]){
				int cost=C[u.iti][i];
				if(va==1){
					cost=T[u.iti][i];
				}
				sima[u.iti]=u.now+cost;
				state.push(S(i,sima[u.iti]));
			}
		}
	}
}

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]=inf;
				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));
		}
	}
}