#include <bits/stdc++.h>
using namespace std;
long long get() {
  long long x = 0;
  char s = getchar();
  while (s < '0' || s > '9') s = getchar();
  while (s >= '0' && s <= '9')
    x = (x << 3) + (x << 1) + (s ^ 48), s = getchar();
  return x;
}
long long Min(const long long x, const long long y) {
  if (x < y) return x;
  return y;
}
long long Max(const long long x, const long long y) {
  if (x > y) return x;
  return y;
}
const long long M = 1e6 + 5;
long long n, m, s, head[M], cntedge, sum1[15000], sum2[15000], up, dfn[M],
    low[M], tot, cntscc, scc[M], sumw[M], ans, dp[M];
bool in[M];
stack<long long> st;
vector<pair<long long, long long> > G[M];
struct edge {
  long long to, nxt, w, totw;
  edge() {}
  edge(const long long T, const long long NX, const long long W,
       const long long TW) {
    to = T, nxt = NX, w = W, totw = TW;
  }
} e[M];
void add(const long long u, const long long v, const long long w,
         const long long totw) {
  e[++cntedge] = edge(v, head[u], w, totw), head[u] = cntedge;
}
void init() {
  for (long long i = 1;; ++i) {
    sum1[i] = sum1[i - 1] + i;
    sum2[i] = sum2[i - 1] + sum1[i];
    if (sum1[i] >= 100000000) {
      up = i;
      break;
    }
  }
}
long long calc(long long w) {
  long long i = upper_bound(sum1, sum1 + up + 1, w) - sum1 - 1;
  return w * (i + 1) - sum2[i];
}
void tarjan(const long long u) {
  dfn[u] = low[u] = ++tot;
  in[u] = 1;
  st.push(u);
  long long v;
  for (long long i = head[u]; i; i = e[i].nxt)
    if (!dfn[v = e[i].to])
      tarjan(v), low[u] = Min(low[u], low[v]);
    else if (in[v])
      low[u] = Min(low[u], dfn[v]);
  if (low[u] == dfn[u]) {
    ++cntscc;
    do {
      v = st.top(), st.pop();
      in[v] = 0;
      scc[v] = cntscc;
    } while (v ^ u);
  }
}
void dfs(const long long x) {
  if (dp[x]) return;
  for (long long i = 0; i < G[x].size(); ++i) {
    dfs(G[x][i].first);
    dp[x] = Max(dp[x], dp[G[x][i].first] + G[x][i].second);
  }
  dp[x] += sumw[x];
}
signed main() {
  init();
  n = get(), m = get();
  for (long long i = 1, u, v, w; i <= m; ++i)
    u = get(), v = get(), w = get(), add(u, v, w, calc(w));
  long long s = get();
  for (long long i = 1; i <= n; ++i)
    if (!dfn[i]) tarjan(i);
  for (long long i = 1; i <= n; ++i)
    for (long long j = head[i]; j; j = e[j].nxt)
      if (scc[i] ^ scc[e[j].to])
        G[scc[i]].push_back(pair<long long, long long>(scc[e[j].to], e[j].w));
      else
        sumw[scc[i]] += e[j].totw;
  dfs(scc[s]);
  printf("%lld", dp[scc[s]]);
  return 0;
}
