#include <bits/stdc++.h>
using namespace std;
int to[1102030], nxt[1102030], h[1102030], low[1102030], dfn[1102030], n, m, p,
    colorcnt, instack[1102030], color[1102030];
long long ans, b[1102030], c[1102030], d[1102030], e[1102030], f[1102030], st,
    sum[1102030], dp[1102030];
bool visit[1102030], use[1102030];
vector<pair<long long, long long> > g[1102030];
vector<int> s;
void add_edge(int x, int y) {
  p++;
  to[p] = y;
  nxt[p] = h[x];
  h[x] = p;
}
void dfs(int x) {
  p++;
  instack[x] = 1;
  dfn[x] = p;
  low[x] = dfn[x];
  s.push_back(x);
  for (int i = h[x]; i; i = nxt[i]) {
    if (!instack[to[i]]) {
      dfs(to[i]);
      low[x] = min(low[x], low[to[i]]);
    } else if (instack[to[i]] == 1)
      low[x] = min(low[x], dfn[to[i]]);
  }
  if (dfn[x] == low[x]) {
    while (s.back() != x) {
      color[s.back()] = colorcnt;
      instack[s.back()] = 2;
      s.pop_back();
    }
    color[s.back()] = colorcnt++;
    instack[s.back()] = 2;
    s.pop_back();
  }
}
long long calc(long long x) {
  long long lf, rt, mid;
  lf = 0;
  rt = 20000;
  while (rt - lf > 1) {
    mid = (lf + rt) / 2;
    if (mid * (mid - 1) / 2 <= x)
      lf = mid;
    else
      rt = mid;
  }
  return lf;
}
void dfs2(int u) {
  use[u] = true;
  for (int j = 0; j < g[u].size(); j++) {
    int v = g[u][j].first;
    if (!use[v]) dfs2(v);
    d[v]++;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  p = 0;
  memset(h, 0, sizeof(h));
  memset(nxt, 0, sizeof(nxt));
  for (int i = 0; i < m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    add_edge(u, v);
    b[i] = u;
    c[i] = v;
    e[i] = w;
    long long r = calc(w);
    f[i] = r * w - r * (r + 1) * (r - 1) / 6;
  }
  memset(instack, 0, sizeof(instack));
  colorcnt = 1;
  p = 0;
  for (int i = 1; i <= n; i++)
    if (!instack[i]) dfs(i);
  scanf("%d", &st);
  st = color[st];
  for (int i = 0; i < m; i++) {
    int u = color[b[i]], v = color[c[i]];
    if (u == v)
      sum[u] += f[i];
    else
      g[u].push_back({v, e[i]});
  }
  dfs2(st);
  queue<int> q;
  q.push(st);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    dp[u] += sum[u];
    ans = max(ans, dp[u]);
    for (int i = 0; i < g[u].size(); i++) {
      int v = g[u][i].first;
      d[v]--;
      dp[v] = max(dp[v], dp[u] + g[u][i].second);
      if (!d[v]) q.push(v);
    }
  }
  cout << ans << endl;
  return 0;
}
