#include<cstdio>
#include<queue>
using namespace std;
typedef pair<int,int> T;
typedef struct{
	T pair;
	int flg[300];
}P;
struct Root{
	int a,b;
	int cost,time;
}root[300];
int main(){
	int n,m;
	int p,q,r;
	int k;
	scanf("%d %d",&n,&m);
	while(n!=0&&m!=0){
		for(int i=0;i<n;i++){
			scanf("%d %d %d %d",&root[i].a,&root[i].b,&root[i].cost,&root[i].time);
		}
		scanf("%d",&k);
		for(int i=0;i<k;i++){
			scanf("%d %d %d",&p,&q,&r);
			queue<P> que;
			int sum=10000;
			P t;
			t.pair=make_pair(p,0);
			que.push(t);

			while(!que.empty()){
				P temp=que.front();
				P temp2=temp;
				que.pop();

				for(int i2=0;i2<n;i2++){
					if(temp.pair.first==q){
						sum=min(sum,temp.pair.second);
					}
					if(root[i2].a==temp.pair.first&&temp.flg[temp.pair.first-1]!=-1){
						temp2.flg[temp.pair.first-1]=-1;
						if(r==0){
							temp2.pair=make_pair(root[i2].b,temp.pair.second+root[i2].cost);
							que.push(temp2);
						}
						if(r==1){
							temp2.pair=make_pair(root[i2].b,temp.pair.second+root[i2].time);
							que.push(temp2);
						}
						
					}
					if(root[i2].b==temp.pair.first&&temp.flg[temp.pair.first-1]!=-1){
						temp2.flg[temp.pair.first-1]=-1;
						if(r==0){
							temp2.pair=make_pair(root[i2].a,temp.pair.second+root[i2].cost);
							que.push(temp2);
						}
						if(r==1){
							temp2.pair=make_pair(root[i2].a,temp.pair.second+root[i2].time);
							que.push(temp2);
						}
						
					}

				}
			}

			printf("%d\n",sum);
		}
		scanf("%d %d",&n,&m);
	}
	return 0;
}