#include<iostream>

#define INF 1000000

std::pair<int,int>list[101][101];
int cost[101];
bool used[101];
int n,m,k;

int dijkstra(int s,int g,int r){
	used[s]=true;
	if(used[g])return cost[g];
	for(int i=1;i<=m;i++){
		if(r==0){
			if(list[s][i].first!=INF){
				if(cost[i]>cost[s]+list[s][i].first){
					cost[i]=cost[s]+list[s][i].first;
				}
			}
		}else if(r==1){
			if(list[s][i].second!=INF){
				if(cost[i]>cost[s]+list[s][i].second){
					cost[i]=cost[s]+list[s][i].second;
				}
			}
		}
	}
	int min=0;
	for(int i=1;i<=m;i++){
		if(!used[i]){
			if(cost[min]>cost[i])min=i;
		}
	}
	dijkstra(min,g,r);
}

int main(){
	while(std::cin>>n>>m){
		if(n==0&&m==0)break;
		for(int i=0;i<=m;i++){
			for(int j=0;j<=m;j++){
				list[i][j].first=INF;
				list[i][j].second=INF;
			}
		}
		for(int i=0;i<n;i++){
			int a,b,c,d;
			std::cin>>a>>b>>c>>d;
			list[a][b].first=c;list[a][b].second=d;
			list[b][a].first=c;list[b][a].second=d;
		}
		std::cin>>k;
		for(int i=0;i<k;i++){
			for(int j=0;j<=m;j++)cost[j]=INF,used[j]=false;
			int p,q,r;
			std::cin>>p>>q>>r;
			cost[p]=0;
			std::cout<<dijkstra(p,q,r)<<std::endl;
		}
	}
	return 0;
}