#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000002;
long long memo[MAXN];
long long cost[MAXN];
int tin[MAXN];
int low[MAXN];
bool in_stack[MAXN];
int Stack[MAXN];
int comp[MAXN];
vector<pair<int, int> > g[MAXN];
vector<pair<int, int> > t[MAXN];
int n, m, s;
int u, v, w;
int SCC, T, top;
void fast_io() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
}
long long contrib(int o) {
  int lo = 0, hi = o;
  int n = -1;
  while (lo <= hi) {
    int mid = (lo + hi) >> 1;
    if (1LL * mid * (mid + 1) <= (o << 1))
      n = mid, lo = mid + 1;
    else
      hi = mid - 1;
  }
  return 1LL * o * (n + 1) - 1LL * n * (n + 1) * (n + 2) / 6;
}
void tarjan(int u) {
  low[u] = tin[u] = ++T;
  Stack[top++] = u, in_stack[u] = 1;
  for (auto v : g[u]) {
    if (!tin[v.first]) tarjan(v.first);
    if (in_stack[v.first]) low[u] = min(low[u], low[v.first]);
  }
  if (tin[u] == low[u]) {
    ++SCC;
    while (top) {
      int v = Stack[--top];
      in_stack[v] = 0, comp[v] = SCC;
      if (u == v) break;
    }
  }
}
long long solve(int u) {
  if (memo[u] != -1) return memo[u];
  long long res = cost[u];
  for (auto v : t[u]) {
    res = max(res, cost[u] + v.second + solve(v.first));
  }
  return memo[u] = res;
}
int main() {
  fast_io();
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> u >> v >> w;
    g[u].push_back(make_pair(v, w));
  }
  cin >> s;
  tarjan(s);
  for (int i = 1; i <= n; i++) {
    if (!tin[i]) continue;
    int u = comp[i];
    for (auto v : g[i]) {
      int to = comp[v.first];
      if (u != to)
        t[u].push_back(make_pair(to, v.second));
      else
        cost[u] += contrib(v.second);
    }
  }
  memset(memo, -1, sizeof(memo));
  printf("%lld\n", solve(comp[s]));
  return 0;
}
