#include<queue>
#include<cstdio>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

template<class T>
class d_heap{
	static const int N_MAX=3000; // !!
	int n,d;
	T a[N_MAX];
public:
	d_heap(int d):n(0),d(d){}
	const T &find_min()const{ return a[0]; }
	void insert(const T &x){
		int u=n++;
		a[u]=x;
		while(u!=0 && a[(u-1)/d]>a[u]) swap(a[(u-1)/d],a[u]), u=(u-1)/d;
	}
	void delete_min(){
		a[0]=a[--n];
		for(int u=0;;){
			int v=u;
			for(int w=d*u+1;w<=d*u+d;w++) if(w<n && a[v]>a[w]) v=w;
			if(v==u) break;
			swap(a[v],a[u]);
			u=v;
		}
	}
	bool empty()const{ return n==0; }
	int size()const{ return n; }
};

#define define_heap d_heap< pair<int,int> > H(30);

const int INF=1<<29;

struct edge{ int v,cost1,cost2; };

int main(){
	for(int m,n;scanf("%d%d",&m,&n),n;){
		vector<edge> G[100];
		rep(i,m){
			int u,v,cost1,cost2; scanf("%d%d%d%d",&u,&v,&cost1,&cost2); u--; v--;
			G[u].push_back((edge){v,cost1,cost2});
			G[v].push_back((edge){u,cost1,cost2});
		}

		int q; scanf("%d",&q);
		while(q--){
			int s,t,type; scanf("%d%d%d",&s,&t,&type); s--; t--;

			int d[100];
			rep(u,n) d[u]=(u==s?0:INF);
			define_heap;
			H.insert(make_pair(0,s));
			while(!H.empty()){
				int d_now=H.find_min().first,u=H.find_min().second;
				H.delete_min();

				if(d[u]<d_now) continue;

				rep(i,G[u].size()){
					const edge &e=G[u][i];
					int d2=d_now+(type==0?e.cost1:e.cost2);
					if(d[e.v]>d2){
						d[e.v]=d2;
						H.insert(make_pair(d2,e.v));
					}
				}
			}

			printf("%d\n",d[t]);
		}
	}

	return 0;
}