#include <bits/stdc++.h>
using namespace std;
using pii = pair<long long, long long>;
struct scc {
 public:
  scc(const vector<vector<long long>> &graph) {
    adj = graph;
    n = adj.size();
    adjInv.resize(n);
    for (long long i = 0; i < n; ++i) {
      for (long long to : graph[i]) {
        adjInv[to].push_back(i);
      }
    }
    visited.resize(n, false);
    stack<long long> seen;
    for (long long i = 0; i < n; ++i) {
      if (!visited[i]) {
        dfs1(i, seen);
      }
    }
    visited.assign(n, false);
    sccId.resize(n);
    while (!seen.empty()) {
      long long node = seen.top();
      seen.pop();
      if (visited[node]) {
        continue;
      }
      dfs2(node);
      currScc++;
    }
  }
  long long numberOfSCCs() { return currScc; }
  long long getSccID(long long node) { return sccId[node]; }

 private:
  long long n;
  vector<vector<long long>> adj, adjInv;
  vector<long long> sccId;
  long long currScc = 0;
  vector<bool> visited;
  void dfs1(long long curr, stack<long long> &seen) {
    visited[curr] = true;
    for (long long x : adj[curr]) {
      if (!visited[x]) {
        dfs1(x, seen);
      }
    }
    seen.push(curr);
  }
  void dfs2(long long curr) {
    visited[curr] = true;
    sccId[curr] = currScc;
    for (long long x : adjInv[curr]) {
      if (!visited[x]) {
        dfs2(x);
      }
    }
  }
};
long long dfs(const vector<vector<pii>> &adj, long long v,
              vector<bool> &visited, vector<long long> &dp,
              const vector<long long> &collect) {
  visited[v] = 1;
  long long most = 0;
  for (auto [u, w] : adj[v]) {
    if (!visited[u]) dfs(adj, u, visited, dp, collect);
    most = max(most, dp[u] + w);
  }
  return dp[v] = most + collect[v];
}
long long weight(long long w) {
  long long mx = w, mn = 0;
  while (mx - mn > 1) {
    long long mid = (mx + mn) / 2;
    if ((mid * (mid + 1)) / 2 <= w)
      mn = mid;
    else
      mx = mid;
  }
  return w * mx - (mx - 1) * mx * (mx + 1) / 6;
}
signed main() {
  cin.tie(0)->sync_with_stdio(0);
  long long n, m;
  cin >> n >> m;
  vector<vector<long long>> adj(n);
  vector<vector<pii>> wadj(n);
  for (long long i = 0; i < m; i++) {
    long long x, y, w;
    cin >> x >> y >> w;
    x--, y--;
    adj[x].push_back(y);
    wadj[x].emplace_back(y, w);
  }
  long long s;
  cin >> s;
  s--;
  scc SCC(adj);
  vector<vector<pii>> newadj(SCC.numberOfSCCs());
  for (long long from = 0; from < n; from++)
    for (auto [to, w] : wadj[from])
      if (SCC.getSccID(from) != SCC.getSccID(to))
        newadj[SCC.getSccID(from)].emplace_back(SCC.getSccID(to), w);
  vector<long long> collect(SCC.numberOfSCCs());
  for (long long from = 0; from < n; from++)
    for (auto [to, w] : wadj[from])
      if (SCC.getSccID(from) == SCC.getSccID(to))
        collect[SCC.getSccID(from)] += weight(w);
  vector<bool> visited(n);
  vector<long long> dp(n);
  cout << dfs(newadj, SCC.getSccID(s), visited, dp, collect);
}
