#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
long long n, m, u, v, c, s, cnt = 0, dfscnt = 0, dfs_low[N], dfs_num[N], grp[N],
                            gg[N], DP[N];
vector<pair<long long, long long> > adj[N], g[N];
vector<long long> St;
bool vis[N];
void tarjan(int u) {
  dfs_num[u] = dfs_low[u] = ++cnt;
  St.push_back(u);
  vis[u] = 1;
  for (int i = 0; i < int(adj[u].size()); i++) {
    pair<long long, long long> tmp = adj[u][i];
    if (dfs_num[tmp.first] == -1) tarjan(tmp.first);
    if (vis[tmp.first]) dfs_low[u] = min(dfs_low[u], dfs_low[tmp.first]);
  }
  if (dfs_num[u] == dfs_low[u]) {
    ++dfscnt;
    while (1) {
      int v = St.back();
      St.pop_back();
      grp[v] = dfscnt;
      vis[v] = 0;
      if (v == u) break;
    }
  }
}
long long get(long long numb) {
  long long low = 0, high = numb, res = 0;
  while (low <= high) {
    long long md = (low + high) / 2LL;
    if ((long long)md * (md + 1LL) / 2LL <= numb) {
      res = md;
      low = md + 1LL;
    } else
      high = md - 1LL;
  }
  return ((res + 1LL) * numb -
          ((long long)res * (res + 1LL) * (res + 2LL) / 6LL));
}
long long calc(long long u) {
  if (DP[u] != -1) return DP[u];
  DP[u] = 0;
  for (int i = 0; i < int(g[u].size()); i++) {
    pair<long long, long long> tmp = g[u][i];
    DP[u] = max(DP[u], (long long)tmp.second + calc(tmp.first));
  }
  DP[u] += gg[u];
  return DP[u];
}
int main() {
  memset(dfs_low, -1, sizeof dfs_low);
  memset(dfs_num, -1, sizeof dfs_num);
  memset(gg, 0, sizeof gg);
  memset(vis, 0, sizeof 0);
  memset(DP, -1, sizeof DP);
  scanf("%lld%lld", &n, &m);
  for (int i = 0; i < int(m); i++) {
    scanf("%lld%lld%lld", &u, &v, &c);
    adj[u].push_back({v, c});
  }
  scanf("%lld", &s);
  for (int i = 1; i <= n; i++)
    if (dfs_num[i] == -1) {
      tarjan(i);
    }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < int(adj[i].size()); j++) {
      pair<long long, long long> tmp = adj[i][j];
      if (grp[i] == grp[tmp.first])
        gg[grp[i]] += get(tmp.second);
      else
        g[grp[i]].push_back({grp[tmp.first], tmp.second});
    }
  }
  printf("%lld", calc(grp[s]));
  return 0;
}
