#include <bits/stdc++.h>
using namespace std;
template <class T>
void rd(T &x) {
  x = 0;
  int f = 1;
  char c;
  while (!isdigit(c = getchar()))
    if (c == '-') f = -1;
  do {
    x = (x << 3) + (x << 1) + (c ^ 48);
  } while (isdigit(c = getchar()));
  x *= f;
}
const int N = 1e6 + 5;
vector<pair<int, int> > G[N], nG[N];
stack<int> Sta;
int n, m, tot, sum, dfn[N], low[N], belong[N];
long long w[N], dp[N];
bool vis[N];
void tarjan(int x) {
  dfn[x] = low[x] = ++tot;
  vis[x] = 1;
  Sta.push(x);
  for (auto it : G[x])
    if (!dfn[it.first])
      tarjan(it.first), low[x] = min(low[x], low[it.first]);
    else if (vis[it.first])
      low[x] = min(low[x], dfn[it.first]);
  if (low[x] == dfn[x]) {
    sum++;
    while (!Sta.empty()) {
      int v = Sta.top();
      Sta.pop();
      vis[v] = 0;
      belong[v] = sum;
      if (x == v) break;
    }
  }
}
long long dfs(int x) {
  if (dp[x]) return dp[x];
  for (auto it : nG[x]) dp[x] = max(dp[x], it.second + dfs(it.first));
  return dp[x] += w[x];
}
long long calc(int x) {
  long long t = sqrt(2 * x + 0.25) - 0.5;
  return x * (t + 1) - t * (t + 1) * (t + 2) / 6;
}
int main() {
  rd(n), rd(m);
  for (int i = 1, x, y, z; i <= m; i++)
    rd(x), rd(y), rd(z), G[x].push_back({y, z});
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) tarjan(i);
  for (int i = 1; i <= n; i++)
    for (auto it : G[i])
      if (belong[i] ^ belong[it.first])
        nG[belong[i]].push_back({belong[it.first], it.second});
      else
        w[belong[i]] += calc(it.second);
  int pos;
  rd(pos);
  printf("%lld", dfs(belong[pos]));
  return 0;
}
