#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long s = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') f *= c == '-' ? -1 : 1, c = getchar();
  while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
  return s * f;
}
struct edge {
  int from, nxt, to;
  long long val;
};
struct graph {
  edge e[1000005 << 1];
  int head[2000005], ind[2000005], tot;
  inline void addedge(int u, int v, long long w) {
    ind[v]++;
    e[++tot] = (edge){u, head[u], v, w}, head[u] = tot;
  }
} G;
class SCC : public graph {
  stack<int> s;
  int pre[2000005], low[2000005], dfn;
  bool vis[2000005];
  void dfs(int u) {
    pre[u] = low[u] = ++dfn;
    s.push(u);
    for (int i = head[u]; i; i = e[i].nxt) {
      int v = e[i].to;
      if (!pre[v])
        dfs(v), low[u] = min(low[u], low[v]);
      else if (!scc[v])
        low[u] = min(low[u], pre[v]);
    }
    if (low[u] == pre[u]) {
      int x;
      cnt++;
      do x = s.top(), s.pop(), scc[x] = cnt;
      while (x != u);
    }
  }

 public:
  int cnt, scc[2000005];
  inline void tarjan(int n) {
    for (int i = 1; i <= n; i++)
      if (!pre[i]) dfs(i);
  }
  inline void init() {
    memset(head, 0, sizeof(head));
    memset(pre, 0, sizeof(pre));
    memset(low, 0, sizeof(low));
    memset(scc, 0, sizeof(scc));
    tot = dfn = cnt = 0;
    while (!s.empty()) s.pop();
  }
} G1;
inline long long calc(long long x) {
  long long t = sqrt(2 * x + 0.25) - 0.5;
  return x + t * x - (t + 1) * (t + 2) * t / 6;
}
int n, m, s;
long long val[2000005], dis[2000005];
bool vis[2000005];
queue<int> q;
int main() {
  n = read(), m = read();
  for (register int i = (1); i <= (m); i++) {
    int u = read(), v = read();
    long long w = read();
    G1.addedge(u, v, w);
  }
  G1.tarjan(n);
  s = G1.scc[read()];
  for (register int i = (1); i <= (m); i++) {
    edge e = G1.e[i];
    int u = G1.scc[e.from], v = G1.scc[e.to];
    if (u == v)
      val[u] += calc(e.val);
    else
      G.addedge(u, v, e.val);
  }
  int N = G1.cnt;
  memset(dis, -1, sizeof(dis));
  q.push(s), dis[s] = val[s], vis[s] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis[u] = 0;
    for (int i = G.head[u]; i; i = G.e[i].nxt) {
      edge e = G.e[i];
      int v = e.to;
      if (dis[v] < dis[u] + e.val + val[v]) {
        dis[v] = dis[u] + e.val + val[v];
        if (!vis[v]) q.push(v), vis[v] = 1;
      }
    }
  }
  for (register int i = (1); i <= (N); i++) dis[0] = max(dis[0], dis[i]);
  cout << dis[0];
  return 0;
}
