#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int n, m, idx[maxn], e, y, Y;
long long ans = 0, C[maxn], a[maxn];
vector<pair<int, int>> g[maxn], gr[maxn];
vector<int> ord;
bool mark[maxn];
set<pair<int, int>> A, G[maxn];
set<int> comp[maxn];
long long c(int x) {
  auto k = A.lower_bound({x, 0});
  long long j = k->second;
  return 1ll * j * x - (j + 1) * j * (j - 1) / 6 * 1ll;
}
void dfs1(int x) {
  mark[x] = 1;
  for (auto u : g[x])
    if (!mark[u.first]) dfs1(u.first);
  ord.push_back(x);
}
void dfs2(int x) {
  mark[x] = 1;
  comp[e].insert(x);
  if (x == y) Y = e;
  idx[x] = e;
  for (auto u : gr[x])
    if (!mark[u.first])
      C[e] += c(u.second), dfs2(u.first);
    else if (comp[e].find(u.first) != comp[e].end())
      C[e] += c(u.second);
}
void dfs(int x) {
  for (auto k : G[x]) {
    if (a[x] + k.second + C[k.first] > a[k.first])
      a[k.first] = a[x] + k.second + C[k.first], ans = max(ans, a[k.first]),
      dfs(k.first);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  for (int i = 1; i <= 2e4; i++) A.insert({i * (i + 1) / 2, i});
  cin >> n >> m;
  while (m--) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    gr[v].push_back({u, w});
  }
  cin >> y;
  for (int i = 1; i <= n; i++)
    if (!mark[i]) dfs1(i);
  reverse(ord.begin(), ord.end());
  memset(mark, 0, sizeof mark);
  for (int i : ord)
    if (!mark[i]) e++, dfs2(i);
  for (int i = 1; i <= e; i++)
    for (int k : comp[i])
      for (auto x : g[k])
        if (idx[x.first] != i) G[i].insert({idx[x.first], x.second});
  ans = a[Y] = C[Y];
  dfs(Y);
  cout << ans;
  return 0;
}
