#include <iostream>
using namespace std;

#define INF int(100100)

int main(){
    while(1){
        int n,m;
        cin >> n >> m;
        
        if(n==0&&m==0)  break;          //終了の判断

        int time[m][m],cost[m][m];

        for(int i=0;i<m;i++){           //配列の初期化
            for(int j=0;j<m;j++){
                if(i==j)
                    time[i][j] = cost[i][j] = 0;
                else
                    time[i][j] = cost[i][j] = INF;
            }
        }

        for(int i=0;i<n;i++){           //配列の設定
            int a,b,c,t;
            cin >> a >> b >> c >> t;
            time[a-1][b-1] = time[b-1][a-1] = t;
            cost[a-1][b-1] = cost[b-1][a-1] = c;
        }

        for(int k=0;k<m;k++){           //最短距離に書き換え
            for(int i=0;i<m;i++){
                for(int j=0;j<m;j++){
                    if(time[i][j]>(time[i][k]+time[k][j]))
                        time[i][j] = time[i][k]+time[k][j];
                    if(cost[i][j]>(cost[i][k]+cost[k][j]))
                        cost[i][j] = cost[i][k]+cost[k][j];
                }
            }
        }

        int k;  cin >> k;       
        for(int i=0;i<k;i++){           //表示
            int p,q,r;
            cin >> p >> q >> r;

            if(r==1){
                cout << time[p-1][q-1] << endl;
            }else{
                cout << cost[p-1][q-1] << endl;
            }
        }
    }

    return 0;
}
