#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<pair<int, int> > g[1000010];
vector<int> gt[1000010];
vector<pair<int, int> > gscc[1000010];
int s;
vector<int> topsort;
char used[1000010];
char u[1000010];
vector<int> comp[1000010];
vector<pair<int, int> > out[1000010];
int num[1000010];
long long val[1000010];
int c = 1;
long long prefs[20010];
long long d[1000010];
void dfs1(int v) {
  used[v] = true;
  for (pair<int, int> e : g[v]) {
    if (!used[e.first]) dfs1(e.first);
  }
  topsort.push_back(v);
}
void dfs2(int v) {
  used[v] = true;
  comp[c].push_back(v);
  for (auto e : gt[v]) {
    if (!used[e]) dfs2(e);
  }
}
void calcv() {
  vector<int> edges;
  for (auto v : comp[c]) u[v] = 1;
  for (auto fr : comp[c]) {
    for (pair<int, int> e : g[fr]) {
      if (u[e.first])
        edges.push_back(e.second);
      else
        out[c].push_back(e);
    }
  }
  for (auto v : comp[c]) num[v] = c;
  long long value = 0;
  for (auto e : edges) {
    int lo = 0, hi = 20000;
    while (lo != hi) {
      int mi = (lo + hi + 1) >> 1;
      if (2 * e >= mi * (mi + 1))
        lo = mi;
      else
        hi = mi - 1;
    }
    value += (long long)(lo + 1) * (long long)e - prefs[lo];
  }
  val[c] = value;
  for (auto v : comp[c]) u[v] = 0;
}
vector<int> topo;
void dfs3(int v) {
  used[v] = true;
  for (pair<int, int> e : gscc[v]) {
    if (!used[e.first]) dfs3(e.first);
  }
  topo.push_back(v);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int from, to, len;
    cin >> from >> to >> len;
    g[from].push_back(make_pair(to, len));
    gt[to].push_back(from);
  }
  cin >> s;
  for (int i = 1; i <= n; i++)
    if (!used[i]) dfs1(i);
  for (int i = 0; i <= 20000; i++) {
    prefs[i] = (long long)i * (long long)(i + 1) / 2;
    if (i != 0) prefs[i] += prefs[i - 1];
  }
  reverse(topsort.begin(), topsort.end());
  memset(used, 0, sizeof(used));
  for (auto v : topsort) {
    if (!used[v]) {
      dfs2(v);
      calcv();
      c++;
    }
  }
  for (int i = 1; i < c; i++) {
    for (pair<int, int> e : out[i]) {
      int fr = i, to = num[e.first], len = e.second;
      gscc[fr].push_back(make_pair(to, len));
    }
  }
  for (int i = 1; i <= n; i++) d[i] = 0;
  int st = num[s];
  d[st] = val[st];
  memset(used, 0, sizeof(used));
  dfs3(st);
  reverse(topo.begin(), topo.end());
  for (auto u : topo) {
    for (pair<int, int> e : gscc[u]) {
      d[e.first] = max(d[e.first], d[u] + e.second + val[e.first]);
    }
  }
  long long ans = 0;
  for (int i = 1; i <= n; i++) ans = max(ans, d[i]);
  cout << ans << endl;
  return 0;
}
