#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(),x.end()
#define dbg(x) cout<<#x<<":"<<x<<endl
#define int long long
#define MOD 1e9+7
typedef pair<int,int> P;
typedef pair<int,P> PP;

struct edge{
  int v,l,e;
};

signed main(){
  while(1){
    int n,m,L;
    cin>>n>>m>>L;
    if(n+m+L==0)break;
    vector<vector<edge> > g(n);
    for(int i=0;i<m;i++){
	 int a,b,d,e;
	 cin>>a>>b>>d>>e;
	 a--,b--;
	 if(e==0)d=0;
	 g[a].pb({b,d,e});
	 g[b].pb({a,d,e});
    }
    int INF=1LL<<60;
    int d[101][101];
    fill_n(*d,101*101,INF);
    d[0][0]=0;
    priority_queue<PP,vector<PP>,greater<PP> > que;
    que.push(PP(0,P(0,0)));
    while(que.size()){
	 PP p=que.top();
	 que.pop();
	 int e=p.fi;
	 int l=p.se.fi;
	 int v=p.se.se;
	 if(e>d[v][l])continue;
	 for(int i=0;i<g[v].size();i++){
	   edge to=g[v][i];
	   if(d[to.v][l]>d[v][l]+to.e){
		d[to.v][l]=d[v][l]+to.e;
		que.push(PP(d[to.v][l],P(l,to.v)));
	   }
	   if(l+to.l>L)continue;
	   if(d[to.v][l+to.l]>d[v][l]){
		d[to.v][l+to.l]=d[v][l];
		que.push(PP(d[to.v][l+to.l],P(l+to.l,to.v)));
	   }
	 }
    }
    int mi=1LL<<60;
    for(int i=0;i<101;i++){
	 mi=min(mi,d[n-1][i]);
    }
    cout<<mi<<endl;
  }
  return 0;
}

