#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int,int> P;
#define mp make_pair
#define pb push_back
#define INF 2100000000
struct se1{
	int to,cost;
	se1(int a,int c):to(a),cost(c){}
};
struct se2{
	int to,time;
	se2(int a,int c):to(a),time(c){}
};
int d[105];
int V;
vector<se1>G[105];
vector<se2>GG[105];
void dijkstra1(int s){
	priority_queue<P,vector<P>,greater<P> > pque;
	fill(d,d+(V+1),INF);
	d[s]=0;
	pque.push(mp(0,s));
	while(!pque.empty()){
		P p=pque.top(); pque.pop();
		int v=p.second;
		if(d[v]<p.first) continue;
		for(int i=0;i<G[v].size();i++){
			se1 q=G[v][i];
			if(d[q.to]>d[v]+q.cost){
				d[q.to]=d[v]+q.cost;
				pque.push(mp(d[q.to],q.to));
			}
		}
	}
}
void dijkstra2(int s){
	priority_queue<P,vector<P>,greater<P> > pque;
	fill(d,d+(V+1),INF);
	d[s]=0;
	pque.push(mp(0,s));
	while(!pque.empty()){
		P p=pque.top(); pque.pop();
		int v=p.second;
		if(d[v]<p.first) continue;
		for(int i=0;i<GG[v].size();i++){
			se2 q=GG[v][i];
			if(d[q.to]>d[v]+q.time){
				d[q.to]=d[v]+q.time;
				pque.push(mp(d[q.to],q.to));
			}
		}
	}
}
int n;
int main(){
	while(1){
		for(int i=0;i<105;i++){
			G[i].clear();
			GG[i].clear();
		}
	scanf("%d %d",&n,&V);
	if(!n) break;
	for(int i=0;i<n;i++){
		int ax,ay,bx,by;
		scanf("%d %d %d %d",&ax,&ay,&bx,&by);
		G[ax].pb(se1(ay,bx));
		G[ay].pb(se1(ax,bx));
		GG[ax].pb(se2(ay,by));
		GG[ay].pb(se2(ax,by));
	}
	int Q;
	scanf("%d",&Q);
	for(int i=0;i<Q;i++){
		int rp,er,ep;
		scanf("%d %d %d",&rp,&er,&ep);
		if(ep==0){
			dijkstra1(rp);
			printf("%d\n",d[er]);
		}else{
			dijkstra2(rp);
			printf("%d\n",d[er]);
		}
	}
}
}