#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1010;
int g[N][N];
int dist[N], st[N], d1[N], d2[N];
int n, m, x, y, k, t;
void dijkstra(){
memset(dist, 0x3f, sizeof dist);
memset(st, false, sizeof st);
dist[t] = 0;
for (int i = 0; i < n; i ++ ){
int u = -1;
for (int j = 1; j <= n; j ++ )
if (!st[j] && (u == -1 || dist[u] > dist[j]))
u = j;
for (int j = 1; j <= n; j ++ )
dist[j] = min(dist[j], dist[u] + g[u][j]);
st[u] = true;
}
}
int main(){
scanf("%d%d%d", &n, &m, &t);
memset(g, 0x3f, sizeof g);
for (int i = 1; i <= m; i ++ ){
scanf("%d%d%d", &x, &y, &k);
g[x][y] = min(g[x][y], k);
}
dijkstra();
memcpy(d1, dist, sizeof dist);
for (int i = 1; i <= n; i ++ )
for (int j = i + 1; j <= n; j ++ )
swap(g[i][j], g[j][i]);
dijkstra();
memcpy(d2, dist, sizeof dist);
int res = 0;
for (int i = 1; i <= n; i ++ )
res = max(res, d1[i] + d2[i]);
printf("%d\n", res);
}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N = 110;
int n, m, s;
double v;
double dist[N];
bool st[N];
struct node {
int to;
double p;
double q;
};
vector<node> V[N];
bool spfa() {
memset(st, false, sizeof st);
memset(dist, 0, sizeof dist);
queue<int> q;
q.push(s);
st[s] = true;
dist[s] = v;
while (q.size()) {
int t = q.front();
q.pop();
st[t] = false;
for (int i = 0; i < V[t].size(); i ++ ) {
int To = V[t][i].to;
double P = V[t][i].p, Q = V[t][i].q;
if (dist[To] < (dist[t] - Q) * P) {
dist[To] = (dist[t] - Q) * P;
if (dist[s] > v)
return true;
if (!st[To]) {
q.push(To);
st[To] = true;
}
}
}
}
return false;
}
int main() {
while (~scanf("%d%d%d%lf", &n, &m, &s, &v)) {
for (int i = 1; i <= n; i ++ )
V[i].clear();
while (m -- ) {
int a, b;
double c, d;
node ans;
scanf("%d%d", &a, &b);
scanf("%lf%lf", &c, &d);
ans.to = b, ans.p = c, ans.q = d;
V[a].push_back(ans);
scanf("%lf%lf", &c, &d);
ans.to = a, ans.p = c, ans.q = d;
V[b].push_back(ans);
}
if (spfa())
puts("YES");
else
puts("NO");
}
return 0;
}