#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Edge{
    int from,to,cost;
    Edge(int from,int to,int cost)
        : from(from),to(to),cost(cost) {};
};

const int INF = 1 << 30;
// s:始点,dist:距離,prev:最短経路木
bool bellman(const vector<vector<Edge> >& graph,int s,vector<int> &dist,vector<int> &prev){
    int n = graph.size();
    for(int i=0;i<n;i++) dist[i] = INF;
    dist[s] = 0;
    for(int i=0;i<n;i++) prev[i] = -1;

    bool neg_cycle = false;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<graph[j].size();k++){
                Edge e = graph[j][k];
                if(dist[e.to] > dist[e.from] + e.cost){
                    dist[e.to] = dist[e.from] + e.cost;
                    prev[e.to] = e.from;
                    if(i == n-1){
                        dist[e.to] = -INF;
                        neg_cycle = true;
                    }
                }
            }
        }
    }
    return !neg_cycle;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(true){
        int n,m;
        cin >> n >> m;
        if(n == 0 and m == 0) break;
        vector<vector<Edge> > C(m);
        vector<vector<Edge> > T(m);

        for(int i=0;i<n;i++){
            int a,b,cost,time;
            cin >> a >> b >> cost >> time;
            a--;b--;
            C[a].push_back(Edge(a,b,cost));
            C[b].push_back(Edge(b,a,cost));
            T[a].push_back(Edge(a,b,time));
            T[b].push_back(Edge(b,a,time));
        }
        int k;
        cin >> k;
        vector<int> dist(m);
        vector<int> prev(m);
        for(int i=0;i<k;i++){
            int p,q,r;
            cin >> p >> q >> r;
            p--,q--;
            if(r == 0){
                bellman(C,p,dist,prev);
            }else{
                bellman(T,p,dist,prev);
            }
            cout << dist[q] << endl;
        }
    }
    return 0;
}