#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int bel[N];
struct Tarjan {
  static const int N = ::N;
  int dfn[N], low[N], tim;
  int stk[N], top;
  vector<vector<int> > scc;
  vector<vector<pair<int, int> > > ng;
  void dfs(int u, vector<int> g[]) {
    low[stk[top++] = u] = dfn[u] = tim++;
    for (auto v : g[u])
      if (!~dfn[v])
        dfs(v, g), low[u] = min(low[u], low[v]);
      else if (!~bel[v])
        low[u] = min(low[u], dfn[v]);
    if (low[u] == dfn[u]) {
      scc.push_back(vector<int>());
      do {
        scc.back().push_back(stk[--top]);
        bel[stk[top]] = ((int)(scc).size());
      } while (stk[top] != u);
    }
  }
  void solve(int n, vector<int> g[], vector<int> gw[]) {
    scc.clear();
    ng.clear();
    fill_n(dfn, n, -1);
    tim = 0;
    fill_n(bel, n, -1);
    top = 0;
    for (int i = (0); i < (n); ++i)
      if (!~dfn[i]) dfs(i, g);
    for (int i = (0); i < (n); ++i) bel[i]--;
    ng.resize(((int)(scc).size()));
    for (int i = (0); i < (n); ++i) {
      for (int j = (0); j < (((int)(g[i]).size())); ++j) {
        int v = g[i][j];
        if (bel[i] == bel[v]) continue;
        ng[bel[i]].push_back({bel[v], gw[i][j]});
      }
    }
  }
} tar;
int n, m, nn, S, deg[N];
long long val[N], dis[N];
vector<int> g[N], gw[N];
long long sum1(long long n) { return (1 + n) * n / 2; }
long long sum2(long long n) { return n * (n + 1) * (2 * n + 1) / 6; }
void solve() {
  for (int i = (0); i < (n); ++i) g[i].clear(), gw[i].clear();
  for (int i = (0); i < (m); ++i) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    g[a].push_back(b);
    gw[a].push_back(c);
  }
  tar.solve(n, g, gw);
  nn = ((int)(tar.scc).size());
  fill_n(val, n, 0);
  for (int i = (0); i < (n); ++i) {
    for (int j = (0); j < (((int)(g[i]).size())); ++j) {
      int v = g[i][j];
      if (bel[i] != bel[v]) continue;
      int l = gw[i][j];
      int mxi = sqrt(l * 2);
      while (mxi * (mxi + 1) > l * 2) mxi--;
      val[bel[i]] += (1ll * (mxi + 1) * l - (sum2(mxi) + sum1(mxi)) / 2);
    }
  }
  scanf("%d", &S);
  S--;
  fill_n(deg, nn, 0);
  for (int i = (0); i < (nn); ++i)
    for (auto v : tar.ng[i]) deg[v.first]++;
  for (int i = (0); i < (nn); ++i) dis[i] = -1;
  dis[bel[S]] = val[bel[S]];
  queue<int> que;
  for (int i = (0); i < (nn); ++i)
    if (!deg[i]) que.push(i);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (auto v : tar.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 < (nn); ++i) ans = max(ans, dis[i]);
  printf("%lld\n", ans);
}
int main() {
  while (~scanf("%d%d", &n, &m)) solve();
  return 0;
}
