#include<stdio.h>
#include<stdlib.h>
#define rep(i,n) for(int i=0;(i)<(n);(i)++)
#define N 10000000
#define INF 9999999
typedef struct{
    int dis;
    int e;
}Load;
typedef struct{
    int pos;
    int rest;
}Data;
Data queue[N];
int head,num;
void enqueue(int pos,int rest){
    if(num<N){
        queue[(head+num)%N].pos=pos;
        queue[(head+num)%N].rest=rest;
        num++;
    }else{
        printf("エラー");
        exit(1);
    }
}
Data dequeue(int cost[100][101]){
    int index=head;
    int min=cost[queue[head].pos][queue[head].rest];
    for(int i=head+1;i<head+num;i++){
        if(min>cost[queue[i%N].pos][queue[i%N].rest]){
            min=cost[queue[i%N].pos][queue[i%N].rest];
            index=i%N;
        }
    }
    Data tmp=queue[head]; queue[head]=queue[index]; queue[index]=tmp;
    Data d={-1,-1};
    if(num>0){
        d=queue[head];
        head=(head+1)%N;
        num--;
    }
    return d;
}
int main(void){
    while(1){
        int n,m,L;
        scanf("%d%d%d",&n,&m,&L);
        if(n+m+L==0) break;
        Load dist[100][100]={0};
        int cost[100][101];
        rep(i,100) rep(j,101) cost[i][j]=INF;
        rep(i,m){
            int a,b,d,e;
            scanf("%d%d%d%d",&a,&b,&d,&e);
            a--; b--;
            dist[a][b].dis=dist[b][a].dis=d;
            dist[a][b].e=dist[b][a].e=e;
        }
        head=num=0;
        cost[0][L]=0;
        enqueue(0,L);
        while(1){
            Data tmp=dequeue(cost);
            int pos=tmp.pos,rest=tmp.rest;
            if(pos==n-1) continue;
            if(pos==-1) break;
            for(int i=0;i<n;i++){
                if(pos==i||dist[pos][i].dis==0) continue;
                if(rest<dist[pos][i].dis){
                    if(cost[i][rest]>cost[pos][rest]+dist[pos][i].e){
                        cost[i][rest]=
                        cost[pos][rest]+dist[pos][i].e;
                        enqueue(i,rest);
                    }
                }
                else{
                    if(cost[i][rest-dist[pos][i].dis]>
                       cost[pos][rest]){
                        cost[i][rest-dist[pos][i].dis]=
                        cost[pos][rest];
                        enqueue(i,rest-dist[pos][i].dis);
                    }
                    if(cost[i][rest]>cost[pos][rest]+dist[pos][i].e){
                        cost[i][rest]=
                        cost[pos][rest]+dist[pos][i].e;
                        enqueue(i,rest);
                    }
                }
            }
        }
        /*for(int i=0;i<n;i++){
            for(int j=0;j<=L;j++){
                printf("%5d ",cost[i][j]);
            }puts("");
        }puts("");*/
        int min=INF;
        for(int i=0;i<=L;i++){
            if(min>cost[n-1][i]) min=cost[n-1][i];
        }
        printf("%d\n",min);
    }
}

