#include <stdio.h>
#include <algorithm>

using namespace std;
int cost[101][101][2];
int d[101];   //始点固定は最初
bool used[101];
int n,m;    //mは頂点数


void dijkstra(int s,int r){
	for(int j=0;j<m;j++){
	d[j]=1000000;
	used[j]=false;
	}


    d[s]=0;
	while(true){
		int v=-1;
		for(int u=0; u<m;u++){
			if(!used[u] && (v == -1 || d[u] < d[v]))
				 v=u;
		}
		
		if(v == -1)
			break;
		used[v] = true;
		for ( int u =0; u < m; u++){
			d[u] = min(d[u], d[v] + cost[v][u][r]);
		}
	}
}

int main(void){
	for(;;){
		int a,b,time,cos;
    	scanf("%d %d",&n,&m);
	if(!(n|m))
		break;
		for(int i=0;i<m;i++){
				for(int j=0;j<m;j++){
    						cost[i][j][0]=1000000;
							cost[i][j][1]=1000000;
				}
		}
    	for(int i=0;i<n;i++){
    		scanf("%d %d %d %d",&a,&b,&cos,&time);
			a--; b--;
			cost[a][b][0]=cos;
			cost[b][a][0]=cos;
			cost[a][b][1]=time;
			cost[b][a][1]=time;
		}
		
		int p,q,r;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
		scanf("%d %d %d",&p,&q,&r);
		p--;q--;
		dijkstra(p,r);
		printf("%d\n",d[q]);
		}
	}

	return 0;
}