#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int s, n, m;
long long sg[100002];
vector<pair<int, int> > v[1000002], tr[1000002], vctc[1000002];
deque<int> d;
bool viz[1000002];
void dfs(int nod) {
  viz[nod] = 1;
  for (int i = 0; i < v[nod].size(); ++i) {
    int vecin = v[nod][i].first;
    if (!viz[vecin]) dfs(vecin);
  }
  d.push_back(nod);
}
vector<int> cc[1000002];
int x, poz[1000002], gr[1000002];
void dfs2(int nod) {
  viz[nod] = 1;
  cc[x].push_back(nod);
  poz[nod] = x;
  for (int i = 0; i < tr[nod].size(); ++i) {
    int vecin = tr[nod][i].first;
    if (!viz[vecin]) dfs2(vecin);
  }
}
long long cost[1000002], dp[1000002];
map<pair<int, int>, int> mx;
void dfsc(int nod) {
  viz[nod] = 1;
  for (int i = 0; i < vctc[nod].size(); ++i) {
    int vecin = vctc[nod][i].first;
    ++gr[vecin];
    if (!viz[vecin]) dfsc(vecin);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    v[a].push_back({b, c});
    tr[b].push_back({a, c});
  }
  cin >> s;
  for (int i = 1; i <= n; ++i)
    if (!viz[i]) dfs(i);
  memset(viz, 0, sizeof(viz));
  while (!d.empty()) {
    int nod = d.back();
    d.pop_back();
    if (!viz[nod]) ++x, dfs2(nod);
  }
  int ttc = poz[s];
  for (int i = 1; i <= 100000; ++i) sg[i] = 1LL * i * (i + 1) / 2 + sg[i - 1];
  for (int i = 1; i <= n; ++i)
    if (viz[i])
      for (int j = 0; j < v[i].size(); ++j) {
        int vec = v[i][j].first;
        if (poz[i] == poz[vec]) {
          int st = 0;
          int dr = 100000;
          int ans = 0;
          while (st <= dr) {
            int mid = (st + dr) / 2;
            if (1LL * mid * (mid + 1) / 2 <= v[i][j].second)
              ans = mid, st = mid + 1;
            else
              dr = mid - 1;
          }
          cost[poz[i]] += 1LL * (ans + 1) * v[i][j].second - sg[ans];
        } else {
          vctc[poz[i]].push_back({poz[vec], v[i][j].second});
        }
      }
  memset(viz, 0, sizeof(viz));
  dfsc(ttc);
  long long ans = 0;
  deque<int> cd;
  for (int i = 1; i <= x; ++i)
    if (!gr[i] && viz[i]) cd.push_back(i);
  while (!cd.empty()) {
    int ctc = cd[0];
    dp[ctc] += cost[ctc];
    ans = max(ans, dp[ctc]);
    cd.pop_front();
    for (int i = 0; i < cc[ctc].size(); ++i) {
      int x = cc[ctc][i];
      for (int j = 0; j < v[x].size(); ++j) {
        int vec = v[x][j].first;
        if (poz[x] != poz[vec]) {
          dp[poz[vec]] = max(dp[poz[vec]], dp[ctc] + v[x][j].second);
          --gr[poz[vec]];
          if (!gr[poz[vec]]) cd.push_back(poz[vec]);
        }
      }
    }
  }
  cout << ans;
  return 0;
}
