#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
const int inf = 2147483647;
int n, m, s, sc, tot, top, f[maxn], dfn[maxn], low[maxn], stk[maxn], scc[maxn], val[maxn], deg[maxn];
bool instack[maxn];
vector<tuple<int, int, float> > e[maxn];
vector<pair<int, int> > g[maxn];
void tarjan(int u) {
dfn[u] = low[u] = ++tot; stk[++top] = u; instack[u] = true;
for (auto [v, w1, w2] : e[u])
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if (instack[v]) low[u] = min(low[u], dfn[v]);
if (dfn[u] == low[u]) {
instack[u] = false; scc[u] = ++sc;
for (int v; (v = stk[top]) != u; top--)
instack[v] = false, scc[v] = sc; --top;
}
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, w1; float w2;
cin >> u >> v >> w1 >> w2;
e[u].emplace_back(v, w1, w2);
} cin >> s;
for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i);
for (int i = 1; i <= n; i++)
for (auto [v, w1, w2] : e[i])
if (scc[i] != scc[v]) g[scc[i]].emplace_back(scc[v], w1), ++deg[scc[v]];
else for (; w1; w1 *= w2) val[scc[i]] += w1;
for (int i = 1; i <= sc; i++) if (deg[i] == 0) stk[++top] = i, f[i] = -inf;
f[scc[s]] = val[scc[s]];
while (top) {
int u = stk[top--];
for (auto [v, w] : g[u]) {
f[v] = max(f[v], f[u] + w + val[v]);
if (--deg[v] == 0) stk[++top] = v;
}
}
cout << *max_element(f + 1, f + sc + 1) << '\n';
return 0;
}