#include <bits/stdc++.h>
using namespace std;
stack<long long> stk;
const long long N = 1e6 + 5;
long long Time[N], visited[N], low[N], root[N], val[N], now, num_scc, dp[N];
bool check[N];
vector<pair<long long, long long> > adjlist[N];
vector<pair<long long, long long> > edge[N];
long long cacl(long long x) {
  long long n = (sqrt(8 * x + 1) - 1) / 2;
  if (n * (n + 1) / 2 > x) n--;
  return (n + 1) * x - (n * (n + 1) * (2 * n + 1) / 6 + (n + 1) * n / 2) / 2;
}
void scc(long long u) {
  Time[u] = low[u] = ++now;
  visited[u] = 1;
  stk.push(u);
  for (long long i = 0; i < adjlist[u].size(); i++) {
    long long v = adjlist[u][i].first;
    if (!Time[v]) {
      scc(v);
    }
    if (visited[v]) {
      low[u] = min(low[u], low[v]);
    }
  }
  if (low[u] == Time[u]) {
    ++num_scc;
    while (1) {
      long long v = stk.top();
      root[v] = num_scc;
      stk.pop();
      visited[v] = 0;
      if (v == u) break;
    }
  }
}
void dfs(long long u) {
  if (edge[u].size() == 0) {
    dp[u] = val[u];
    check[u] = 1;
    return;
  }
  check[u] = 1;
  for (long long i = 0; i < edge[u].size(); i++) {
    long long v = edge[u][i].first, c = edge[u][i].second;
    if (!check[v]) dfs(v);
    dp[u] = max(dp[u], dp[v] + val[u] + c);
  }
}
signed main() {
  long long n, m, s, u, v, c;
  scanf("%lld %lld", &n, &m);
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld%lld", &u, &v, &c);
    adjlist[u].push_back(pair<long long, long long>(v, c));
  }
  scanf("%lld", &s);
  for (long long i = 1; i <= n; i++) {
    if (Time[i] == 0) {
      now = 0;
      scc(i);
    }
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 0; j < adjlist[i].size(); j++) {
      u = adjlist[i][j].first;
      c = adjlist[i][j].second;
      if (root[i] == root[u]) {
        val[root[i]] += cacl(c);
      } else {
        edge[root[i]].push_back(pair<long long, long long>(root[u], c));
      }
    }
  }
  dfs(root[s]);
  printf("%lld", dp[root[s]]);
}
