#include<bits/stdc++.h>
using namespace std;
#define INF 1<<30
struct edge{int to,cost,time;};
vector<edge> G[101];
int d[101];
bool visited[101];
void dic(int p,int m){
  for(int i=0;i<101;++i) d[i]=INF,visited[i]=false;
  d[p]=0;
  int id;
  for(int i=0;i<m;++i){
    id=-1;
    for(int j=0;j<m;++j){
      if(!visited[j])
        if(id==-1||d[id]>d[j])
          id=j;
    }
    visited[id]=true;
    for(int i=0;i<G[id].size();++i){
      edge e = G[id][i];
      d[e.to]=min(d[e.to],d[id]+e.cost);
    }
  }
}
void dit(int p,int m){
  for(int i=0;i<101;++i) d[i]=INF,visited[i]=false;
  d[p]=0;
  int id;
  for(int i=0;i<m;++i){
    id=-1;
    for(int j=0;j<m;++j){
      if(!visited[j])
        if(id==-1||d[id]>d[j])
          id=j;
    }
    visited[id]=true;
    for(int i=0;i<G[id].size();++i){
      edge e = G[id][i];
      d[e.to]=min(d[e.to],d[id]+e.time);
    }
  }
}
int main(){
  int n,m;
  while(cin>>n>>m,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;
      if(r) dit(p,m);
      else dic(p,m);
      cout<<d[q]<<endl;
    }
  }
  return 0;
}