#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e6 + 10;
vector<pair<long long, long long> > adj[maxn];
vector<long long> trans[maxn];
long long col[maxn], vis[maxn], idx = 0, n, m;
stack<long long> st;
long long dp[maxn], now, cost;
void dfs1(long long u) {
  vis[u] = 1;
  for (auto v : adj[u])
    if (!vis[v.first]) dfs1(v.first);
  st.push(u);
}
void dfs2(long long u) {
  col[u] = idx;
  for (auto v : trans[u])
    if (!col[v]) dfs2(v);
}
void scc() {
  for (long long i = 1; i <= n; i++)
    if (!vis[i]) dfs1(i);
  for (long long u = 1; u <= n; u++)
    for (auto v : adj[u]) trans[v.first].push_back(u);
  while (!st.empty()) {
    long long u = st.top();
    st.pop();
    if (col[u]) continue;
    idx++;
    dfs2(u);
  }
}
long long findcost(long long x) {
  long long lo = 0, hi = 100000LL, ans;
  while (lo <= hi) {
    long long mid = (lo + hi) >> 1;
    long long tmp = (mid * (mid + 1)) >> 1;
    if (x >= tmp)
      ans = mid, lo = mid + 1;
    else
      hi = mid - 1;
  }
  return x * (ans + 1) - (ans * (ans + 1) * (ans + 2)) / 6;
}
vector<pair<long long, long long> > v[maxn];
void dfs(long long node) {
  vis[node] = true;
  for (auto b : adj[node]) {
    if (col[b.first] != now) continue;
    cost += findcost(b.second);
    if (vis[b.first]) continue;
    dfs(b.first);
  }
}
long long a[maxn];
long long get(long long node) {
  if (dp[node] != -1) return dp[node];
  long long &ret = dp[node];
  ret = 0;
  for (auto b : v[node]) {
    ret = max(ret, get(b.first) + b.second);
  }
  ret += a[node];
  return ret;
}
int32_t main() {
  memset(dp, -1, sizeof dp);
  scanf("%lld", &n), scanf("%lld", &m);
  for (long long i = 1; i <= m; i++) {
    long long x, y, w;
    scanf("%lld", &x), scanf("%lld", &y), scanf("%lld", &w);
    adj[x].push_back(pair<long long, long long>(y, w));
  }
  long long start;
  cin >> start;
  scc();
  long long mx = 0;
  for (long long i = 1; i <= n; i++) mx = max(col[i], mx);
  for (long long i = 1; i <= n; i++) {
    for (auto b : adj[i]) {
      if (col[i] != col[b.first])
        v[col[i]].push_back(pair<long long, long long>(col[b.first], b.second));
    }
  }
  memset(vis, 0, sizeof vis);
  for (long long i = 1; i <= n; i++) {
    if (!vis[i]) {
      now = col[i];
      cost = 0;
      dfs(i);
      a[col[i]] = cost;
    }
  }
  printf("%lld\n", get(col[start]));
  return 0;
}
