program liukee;
type lkj=record
next:longint;
a:double;
b:double;
end;
var
a:array[1..100,0..100] of lkj;
visit:array[1..100] of boolean;
tot:array[1..100] of longint;
q:array[1..1000000] of longint;
best:array[1..100] of double;
n,m,st:longint;
sum:double;
procedure init;
var
i,x,y:longint;
a1,b1,a2,b2:double;
begin
readln(n,m,st,sum);
for i:=1 to m do
begin
readln(x,y,a1,b1,a2,b2);
inc(tot[x]);
a[x,tot[x]].next:=y;
a[x,tot[x]].a:=a1;
a[x,tot[x]].b:=b1;
inc(tot[y]);
a[y,tot[y]].next:=x;
a[y,tot[y]].a:=a2;
a[y,tot[y]].b:=b2;
end;
end;
procedure spfa;
var
l,r,i,now:longint;
begin
fillchar(visit,sizeof(visit),0);
fillchar(q,sizeof(q),0);
l:=0;r:=1;
for i:=1 to n do best:=-maxlongint;
best[st]:=sum;
q[1]:=st;
visit[st]:=true;
while l<r do
begin
inc(l);
now:=q[l];
visit[now]:=false;
for i:=1 to tot[now] do
if best[a[now,i].next]<(best[now]-a[now,i].b)*a[now,i].a then
begin
best[a[now,i].next]:=(best[now]-a[now,i].b)*a[now,i].a;
if best[st]>sum then
begin
writeln('YES');
exit;
end;
if not visit[a[now,i].next] then
begin
inc(r);
q[r]:=a[now,i].next;
visit[q[r]]:=true;
end;
end;
end;
writeln('NO');
end;
begin
init;
spfa;
end.