#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 6;
int n, m, S, sn, deg[N];
long long val[N], dis[N];
long long sum1(long long x) { return x * (x + 1) / 2; }
long long sum2(long long x) { return x * (x + 1) * (2 * x + 1) / 6; }
long long getv(int l) {
  int mxi = sqrt(2 * l);
  while (mxi * (mxi + 1) > 2 * l) mxi--;
  return (mxi + 1ll) * l - (sum1(mxi) + sum2(mxi)) / 2;
}
namespace SCC {
const int N = ::N;
int bel[N], vis[N];
vector<int> v, g[N], rg[N], gw[N];
vector<vector<int> > scc;
vector<vector<pair<int, int> > > ng;
void dfs1(int u) {
  vis[u] = 1;
  for (auto v : g[u])
    if (!vis[v]) dfs1(v);
  v.push_back(u);
}
void dfs2(int u) {
  bel[u] = ((int)(scc).size());
  scc.back().push_back(u);
  for (auto v : rg[u])
    if (!bel[v]) dfs2(v);
}
void solve(int n) {
  scc.clear();
  ng.clear();
  v.clear();
  fill_n(vis, n, 0);
  fill_n(bel, n, 0);
  for (int u = (0); u < (n); ++u)
    if (!vis[u]) dfs1(u);
  reverse((v).begin(), (v).end());
  for (auto u : v)
    if (!bel[u]) scc.push_back(vector<int>()), dfs2(u);
  for (int u = (0); u < (n); ++u) bel[u]--;
  ng.resize(((int)(scc).size()));
  sn = ((int)(scc).size());
  fill_n(val, sn, 0);
  fill_n(deg, sn, 0);
  for (int u = (0); u < (n); ++u)
    for (int _v = (0); _v < (((int)(g[u]).size())); ++_v) {
      int v = g[u][_v];
      if (bel[u] == bel[v])
        val[bel[u]] += getv(gw[u][_v]);
      else
        ng[bel[u]].push_back({bel[v], gw[u][_v]}), deg[bel[v]]++;
    }
}
};  // namespace SCC
void solve() {
  using namespace SCC;
  for (int i = (0); i < (n); ++i) g[i].clear(), rg[i].clear(), gw[i].clear();
  for (int i = (0); i < (m); ++i) {
    int a, b, w;
    scanf("%d%d%d", &a, &b, &w);
    a--;
    b--;
    g[a].push_back(b);
    rg[b].push_back(a);
    gw[a].push_back(w);
  }
  solve(n);
  scanf("%d", &S);
  S = bel[S - 1];
  fill_n(dis, n, -1);
  dis[S] = val[S];
  queue<int> que;
  for (int i = (0); i < (sn); ++i)
    if (!deg[i]) que.push(i);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (auto _v : ng[u]) {
      if (~dis[u] && dis[_v.first] < dis[u] + _v.second + val[_v.first])
        dis[_v.first] = dis[u] + _v.second + val[_v.first];
      if (!--deg[_v.first]) que.push(_v.first);
    }
  }
  long long ans = 0;
  for (int i = (0); i < (sn); ++i) ans = max(ans, dis[i]);
  printf("%lld\n", ans);
}
int main() {
  while (~scanf("%d%d", &n, &m)) solve();
  return 0;
}
