#include<iostream>

int adjacive[100][100][2];
const int INF=1000000000;

int dijkstra(int start,int goal,int type,int num);

int main()
{
	while(1)
	{
		int n,m,k;
		
		std::cin>>n>>m;
		
		if(n==0&&m==0)break;
		
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<m;j++)
			{
				for(int k=0;k<2;k++)
				{
					adjacive[i][j][k]=INF;
				}
			}
		}
		
		for(int i=0;i<n;i++)
		{
			int a,b,c,t;
			std::cin>>a>>b>>c>>t;
			adjacive[a-1][b-1][0]=c;
			adjacive[b-1][a-1][0]=c;
			adjacive[a-1][b-1][1]=t;
			adjacive[b-1][a-1][1]=t;
		}
		
		std::cin>>k;
		
		for(int i=0;i<k;i++)
		{
			int result,p,q,r;
			std::cin>>p>>q>>r;
			result=dijkstra(p,q,r,m);
			std::cout<<result<<std::endl;
		}
	}
	return 0;
}

int dijkstra(int start,int goal,int type,int num)
{
	bool visited[100];
	int cost[100];
	for(int i=0;i<num;i++)
	{
		visited[i]=false;;
		cost[i]=INF;
	}
	
	cost[start-1]=0;
	
	while(1)
	{
		int u=-1;
		for(int i=0;i<num;i++)
		{
			if(!visited[i]&&(u==-1||cost[i]<cost[u]))
			{
				u=i;
			}
		}
		if(u==-1)break;
		
		visited[u]=true;
		for(int i=0;i<num;i++)
		{
			if(!visited[i])
			{
				cost[i] = cost[i] > cost[u] + adjacive[u][i][type] ? cost[u] + adjacive[u][i][type] : cost[i];
			}
		}
	}
	return cost[goal-1];
}