#include<bits/stdc++.h>
using namespace std;
#define INF 1e7
struct edge{int to,cost,time;};
vector<edge> G[101];
int d[101];
bool visited[101];
int V;
void dijkstra(int p,int r){
  fill(d,d+101,INF);
  d[p]=0;
  memset(visited,false,sizeof(visited));
  while(1){
    int id=-1;
    for(int i=0;i<V;++i){
      if(!visited[i])
        if(id==-1 || d[id]>d[i])
          id=i;
    }
    if(id==-1) break;
    visited[id]=true;
    for(int i=0;i<G[id].size();++i){
      edge e=G[id][i];
      if(r) d[e.to]=min(d[e.to],d[id]+e.time);
      else d[e.to]=min(d[e.to],d[id]+e.cost);
    }
  }
}
int main(){
  int n;
  while(cin>>n>>V,n){
    for(int i=0;i<101;++i) G[i].clear();
    for(int i=0;i<n;++i){
      int a,b,c,t; cin>>a>>b>>c>>t;
      G[a].push_back((edge){b,c,t});
      G[b].push_back((edge){a,c,t});
    }
    int k; cin>>k;
    for(int i=0;i<k;++i){
      int p,q,r; cin>>p>>q>>r;
      dijkstra(p,r);
      cout<<d[q]<<endl;
    }
  }
  return 0;
}