//坑点在于要使用两次floyd因为可能存在不是起始货币的环
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
const double INF = 999999.0;
int n,m;
double origin;
int kind;
double x[105];
double cost[105][105];
double profit[105][105];
bool floyd(){
double d[105];
for(int i = 1;i <= n;i++){
d[i] = x[i];
}
for(int k = 1;k <= n;k++){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if((x[i] - cost[i][j]) * profit[i][j] > x[j]){
x[j] = (x[i] - cost[i][j]) * profit[i][j];
}
}
}
}
for(int i = 1;i <= n;i++){
if(x[i] > d[i]) return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin >> n >> m >> kind >> origin;
for(int i = 0;i < m;i++){
int a,b;
cin >> a >> b;
cin >> profit[a][b] >> cost[a][b];
cin >> profit[b][a] >> cost[b][a];
}
x[kind] = origin;
floyd();//坑点在于要使用两次floyd 特别注意这里
//第一次是x与d比较第二次是第二次的x与第一次的x比较因为d此时已被更新
if(floyd()) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}