#include <bits/stdc++.h>
using namespace std;
long long val(int weight) {
  long long k = (long long)(sqrtl((long double)weight * 2 + 0.25) - 0.5);
  return (k * (6 * weight - (k + 1) * (k + 2))) / 6 + weight;
}
vector<pair<int, int>> g[1000007];
vector<int> S;
int num[1000007], low[1000007], dfscnt, scccnt, sccindex[1000007];
bool visited[1000007];
vector<pair<int, int>> f[1000007];
int outdeg[1000007];
long long sccsum[1000007], sccdp[1000007];
void DirectedSCC(int u) {
  low[u] = num[u] = ++dfscnt;
  S.push_back(u);
  visited[u] = true;
  for (auto edge : g[u]) {
    int v = edge.first;
    if (num[v] == 0) DirectedSCC(v);
    if (visited[v]) low[u] = min(low[u], low[v]);
  }
  if (low[u] == num[u]) {
    while (true) {
      int v = S.back();
      S.pop_back();
      sccindex[v] = scccnt;
      visited[v] = false;
      if (u == v) break;
    }
    ++scccnt;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int x, y, w;
    cin >> x >> y >> w;
    --x;
    --y;
    g[x].push_back(make_pair(y, w));
  }
  int s;
  cin >> s;
  --s;
  for (int i = 0; i < n; ++i) {
    if (num[i] == 0) DirectedSCC(i);
  }
  for (int u = 0; u < n; ++u) {
    for (auto edge : g[u]) {
      int v = edge.first;
      int w = edge.second;
      if (sccindex[u] == sccindex[v])
        sccsum[sccindex[u]] += val(w);
      else {
        f[sccindex[v]].push_back(make_pair(sccindex[u], w));
        ++outdeg[sccindex[u]];
      }
    }
  }
  vector<int> active;
  for (int u = 0; u < scccnt; ++u)
    if (outdeg[u] == 0) {
      active.push_back(u);
      sccdp[u] = sccsum[u];
    }
  while (!active.empty()) {
    int u = active.back();
    active.pop_back();
    for (auto edge : f[u]) {
      int v = edge.first;
      int w = edge.second;
      sccdp[v] = max(sccdp[v], sccdp[u] + w + sccsum[v]);
      if (--outdeg[v] == 0) active.push_back(v);
    }
  }
  cout << sccdp[sccindex[s]] << "\n";
  return 0;
}
