#include <bits/stdc++.h>
using namespace std;
template <typename tn>
void read(tn& a) {
  tn x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  a = x * f;
}
template <typename tn>
void cmax(tn& a, tn b) {
  if (b > a) a = b;
}
template <typename tn>
void cmin(tn& a, tn b) {
  if (b < a) a = b;
}
template <typename tn>
tn abs(tn a) {
  return a < 0 ? -a : a;
}
template <typename tn>
tn sqr(tn a) {
  return a * a;
}
const int N = 1500000;
struct edge {
  int to;
  long long len;
};
int S;
int dfs_clock, scc_cnt;
stack<int> s;
vector<edge> E[N], e[N];
long long f[N];
int n, m;
long long v[N];
int dfn[N], scc[N], low[N];
void dfs(int u) {
  dfn[u] = low[u] = ++dfs_clock;
  s.push(u);
  for (int i = 0; i < E[u].size(); i++) {
    int v = E[u][i].to;
    if (!dfn[v]) {
      dfs(v);
      low[u] = min(low[u], low[v]);
    } else if (!scc[v])
      low[u] = min(low[u], dfn[v]);
  }
  if (low[u] == dfn[u]) {
    scc_cnt++;
    for (;;) {
      int x = s.top();
      s.pop();
      scc[x] = scc_cnt;
      if (x == u) break;
    }
  }
}
long long calc(long long x) {
  if (x == 0 || x == 1) return x;
  long long l = 1, r = x;
  while (l < r) {
    long long mid = (l + r + 1) >> 1ll;
    if (mid * (mid - 1) / 2ll <= x)
      l = mid;
    else
      r = mid - 1;
  }
  long long ans = l * (l + 1) * (2 * l + 1) / 6ll;
  ans -= l * (l + 1) / 2ll;
  ans >>= 1ll;
  return l * x - ans;
}
long long dp(int x) {
  if (f[x] != -1) return f[x];
  f[x] = 0;
  for (int i = 0; i < e[x].size(); i++) {
    int y = e[x][i].to;
    long long z = e[x][i].len;
    cmax(f[x], dp(y) + z);
  }
  f[x] += v[x];
  return f[x];
}
int main() {
  read(n);
  read(m);
  for (int i = (1); i <= (m); i++) {
    int x, y, z;
    read(x);
    read(y);
    read(z);
    E[x].push_back((edge){y, z});
  }
  read(S);
  memset(scc, 0, sizeof(scc));
  memset(dfn, 0, sizeof(dfn));
  for (int i = (1); i <= (n); i++)
    if (!dfn[i]) dfs(i);
  for (int x = 1; x <= n; x++) {
    for (int i = 0; i < E[x].size(); i++) {
      int y = E[x][i].to;
      long long z = E[x][i].len;
      if (scc[x] == scc[y])
        v[scc[x]] += calc(z);
      else
        e[scc[x]].push_back((edge){scc[y], z});
    }
  }
  memset(f, -1, sizeof(f));
  cout << dp(scc[S]) << endl;
  return 0;
}
