//ワーシャルフロイド
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 1000001

int mincost[100];
struct Edge{
	int from,to;
	int cost;
	Edge(int a,int b,int c):from(a),to(b),cost(c){}
};

int main(){
	int n,m,p,q,r,k;
	int a,b,c,d;
	vector<Edge> cost[2];
	while(cin>>n>>m,n|m){
		cost[0].clear();
		cost[1].clear();
		for(int i=0;i<n;i++){
			cin>>a>>b>>c>>d;
			a--;b--;
			cost[0].push_back(Edge(a,b,c));
			cost[0].push_back(Edge(b,a,c));
			cost[1].push_back(Edge(a,b,d));
			cost[1].push_back(Edge(b,a,d));
		}
		cin>>k;
		while(k--){
			bool updata;
			fill_n((int*)mincost,sizeof(mincost)/sizeof(int),INF);
			cin>>p>>q>>r;
			p--;q--;
			mincost[p]=0;
			do{
				updata=false;
				for(int i=0;i<2*n;i++){
					Edge &e=cost[r][i];
					if(mincost[e.from]+e.cost < mincost[e.to]){
						mincost[e.to] = mincost[e.from]+e.cost;
						updata=true;
					}
				}
			}while(updata);
			cout<<mincost[q]<<endl;
		}
	}
}