#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct data {
  int u, v;
  long long w;
} in[N];
long long dp[N];
bool vis[N];
vector<long long> adj[N], rev[N], cost[N], id(N), G[N], COST[N], COMP(N);
stack<int> order;
void dfs1(int u) {
  vis[u] = true;
  int sz = adj[u].size();
  for (int i = 0; i < sz; i++)
    if (!vis[adj[u][i]]) dfs1(adj[u][i]);
  order.push(u);
}
void dfs2(int u, int idx) {
  id[u] = idx, vis[u] = true;
  int sz = rev[u].size();
  for (int i = 0; i < sz; i++)
    if (!vis[rev[u][i]]) dfs2(rev[u][i], idx);
}
long long g(long long x) {
  long long lo = 0, hi = 100000000, ans;
  while (lo <= hi) {
    long long mid = (lo + hi) >> 1;
    long long tmp = (mid * (mid + 1)) >> 1;
    if (tmp <= x)
      ans = mid, lo = mid + 1;
    else
      hi = mid - 1;
  }
  return x * (ans + 1) - (ans * (ans + 1) * (ans + 2)) / 6;
}
long long DP(int u) {
  if (dp[u] != -1) return dp[u];
  long long sz = G[u].size(), ret = COMP[u];
  for (int i = 0; i < sz; i++)
    ret = max(ret, COMP[u] + COST[u][i] + DP(G[u][i]));
  return dp[u] = ret;
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) {
    scanf("%d %d %lld", &in[i].u, &in[i].v, &in[i].w);
    long long u = in[i].u, v = in[i].v, w = in[i].w;
    adj[u].push_back(v), rev[v].push_back(u);
    cost[u].push_back(w);
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) dfs1(i);
  for (int i = 0; i <= n; i++) vis[i] = false;
  int cur = 0;
  while (!order.empty()) {
    int u = order.top();
    order.pop();
    if (!vis[u]) dfs2(u, cur++);
  }
  for (int i = 0; i < m; i++) {
    long long &u = id[in[i].u], &v = id[in[i].v];
    if (u != v) {
      G[u].push_back(v);
      COST[u].push_back(in[i].w);
    } else
      COMP[u] += g(in[i].w);
  }
  memset(dp, -1, sizeof dp);
  int s;
  scanf("%d", &s);
  printf("%lld", DP(id[s]));
  return 0;
}
