#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;//n(<=5000) m(<=40000)
const int N=10010;
const int Maxn=999999999;
int head[N];
int now=1;
int distim[N];
int disene[N];
bool vis[N];
int n,m,start,endd,k;
struct node{
int u,v,tim,ene,nxt;
}E[N<<3];
queue<int>q;
inline int read()
{
int x=0;char c=getchar();
while(c<‘0‘||c>‘9‘)c=getchar();
while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
return x;
}
inline void add(int u,int v,int ene,int tim)
{
E[now].v=v;
E[now].ene=ene;
E[now].tim=tim;
E[now].nxt=head[u];
head[u]=now++;
}
inline void spfa(int start)
{
for(int i=1;i<=n;i++)
distim[i]=disene[i]=Maxn;//体力允许,tim最少
distim[start]=0;
disene[start]=0;
vis[start]=1;
q.push(start);
while(!q.empty())
{
int top=q.front();
q.pop();
vis[top]=0;
for(int i=head[top];~i;i=E[i].nxt)
if(distim[E[i].v]>distim[top]+E[i].tim&&disene[top]+E[i].ene<=k)
{
distim[E[i].v]=distim[top]+E[i].tim;
disene[E[i].v]=disene[top]+E[i].ene;
if(!vis[E[i].v])
vis[E[i].v]=1,
q.push(E[i].v);
}
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
head[i]=-1;
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),ene=read(),tim=read();
add(u,v,ene,tim);
add(v,u,ene,tim);
}
start=read();
endd=read();
k=read();
spfa(start);
if(distim[endd]==Maxn)
printf("-1");
else
printf("%d",distim[endd]);
return 0;
}