#include <bits/stdc++.h>
using namespace std;
int n, m, head[2000005], cnt, dfn[2000005], low[2000005], top, in[2000005], tot,
    bl[2000005], S, stk[2000005];
long long num[25005], sum[25005], val[2000005], f[2000005], ans;
struct edge {
  int from, to, next, cost;
} e[2000005];
bool instack[2000005];
template <typename T>
inline T read() {
  T x = 0, w = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') w = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return x * w;
}
inline void adde(int u, int v, int w) {
  e[++cnt] = (edge){u, v, head[u], w};
  head[u] = cnt;
}
void tarjan(int x) {
  dfn[x] = low[x] = ++cnt, stk[++top] = x, instack[x] = 1;
  for (int v, i = head[x]; i; i = e[i].next) {
    v = e[i].to;
    if (!dfn[v])
      tarjan(v), low[x] = min(low[x], low[v]);
    else if (instack[v])
      low[x] = min(low[x], dfn[v]);
  }
  if (low[x] >= dfn[x]) {
    int u;
    tot++;
    do {
      bl[u = stk[top--]] = tot;
      instack[u] = 0;
    } while (u != x);
  }
}
void toposort() {
  memset(f, -0x3f, sizeof(f));
  queue<int> q;
  for (int i = 1; i <= tot; i++)
    if (!in[i]) q.push(i);
  f[bl[S]] = val[bl[S]];
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int v, i = head[u]; i; i = e[i].next) {
      in[v = e[i].to]--;
      f[v] = max(f[v], f[u] + e[i].cost + val[v]);
      if (!in[v]) q.push(v);
    }
  }
}
int main() {
  n = read<int>(), m = read<int>();
  for (int i = 0; i <= 25000; i++) {
    num[i] = (i * (i + 1)) >> 1;
    if (i) sum[i] = sum[i - 1] + num[i];
  }
  for (int u, v, w, i = 1; i <= m; i++) {
    u = read<int>(), v = read<int>(), w = read<int>();
    adde(u, v, w);
  }
  S = read<int>();
  cnt = 0;
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) tarjan(i);
  memset(head, 0, sizeof(head)), cnt = 0;
  for (int pos, u, v, i = 1; i <= m; i++) {
    u = e[i].from, v = e[i].to;
    if (bl[u] == bl[v]) {
      pos = upper_bound(num + 1, num + 25000 + 1, e[i].cost) - num - 1;
      val[bl[u]] += (1ll * e[i].cost * (pos + 1) - sum[pos]);
      continue;
    }
    adde(bl[u], bl[v], e[i].cost), in[bl[v]]++;
  }
  toposort();
  for (int i = 1; i <= tot; i++) ans = max(ans, f[i]);
  printf("%I64d\n", ans);
  return 0;
}
