#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<pair<int, int> > edge[N], g[N];
stack<int> stk;
long long f[N], val[N];
int n, m;
int low[N], dfn[N], sccno[N];
int num = 0, tim = 0;
int s;
void tarjan(int x) {
  low[x] = dfn[x] = ++tim;
  stk.push(x);
  for (auto edg : edge[x]) {
    int u = edg.first, w = edg.second;
    if (!low[u]) {
      tarjan(u);
      dfn[x] = min(dfn[x], dfn[u]);
    } else if (!sccno[u])
      dfn[x] = min(dfn[x], low[u]);
  }
  if (dfn[x] == low[x]) {
    num++;
    while (true) {
      int u = stk.top();
      stk.pop();
      sccno[u] = num;
      if (u == x) break;
    }
  }
}
long long work(int x) {
  if (~f[x]) return f[x];
  f[x] = 0;
  for (auto edg : g[x]) f[x] = max(f[x], work(edg.first) + edg.second);
  return f[x] += val[x];
}
long long calc(int x) {
  int rt = sqrt(2 * x);
  while ((long long)rt * (rt - 1) / 2 <= x) rt++;
  while ((long long)rt * (rt - 1) / 2 > x) rt--;
  return (long long)rt * x - (long long)(rt + 1) * rt * (rt - 1) / 6;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i(1); i <= (m); ++i) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    edge[x].push_back(make_pair(y, z));
  }
  scanf("%d", &s);
  tarjan(s);
  for (int i(1); i <= (n); ++i) {
    for (auto edg : edge[i]) {
      int x = i, y = edg.first;
      if (sccno[x] == sccno[y])
        val[sccno[x]] += calc(edg.second);
      else
        g[sccno[x]].push_back(make_pair(sccno[y], edg.second));
    }
  }
  memset(f, -1, sizeof(f));
  printf("%lld\n", work(sccno[s]));
  return 0;
}
