#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<long long> Prog(1e5 + 1, 0), Sumprog(1e5, 0);
vector<vector<long long>> Rg, G, Cost, Val;
vector<vector<pair<int, long long>>> GComp;
vector<int> Comp, Ts;
vector<long long> Valcomp;
vector<int> Met;
void dfs1(int v) {
  Met[v] = 1;
  for (int i = 0; i < G[v].size(); i++) {
    if (Met[G[v][i]] == 1) continue;
    dfs1(G[v][i]);
  }
  Ts.push_back(v);
  return;
}
void topsort() {
  Ts.clear();
  Met.resize(n, 0);
  for (int i = 0; i < n; i++) {
    if (Met[i] == 0) dfs1(i);
  }
  reverse(Ts.begin(), Ts.end());
  return;
}
int cou = -1;
void dfs2(int v) {
  Comp[v] = cou;
  for (int i = 0; i < Rg[v].size(); i++) {
    if (Comp[Rg[v][i]] != -1) continue;
    dfs2(Rg[v][i]);
  }
  return;
}
void kras() {
  Comp.resize(n, -1);
  for (int i = 0; i < n; i++)
    if (Comp[Ts[i]] == -1) {
      cou++;
      dfs2(Ts[i]);
    }
  return;
}
vector<long long> Ns, NMet;
void dfs3(int v) {
  NMet[v] = 1;
  for (int i = 0; i < GComp[v].size(); i++) {
    if (NMet[GComp[v][i].first] == 1) continue;
    dfs3(GComp[v][i].first);
  }
  Ns.push_back(v);
  return;
}
void topsort2() {
  Ns.clear();
  NMet.resize(Valcomp.size(), 0);
  for (int i = 0; i < Valcomp.size(); i++) {
    if (NMet[i] == 0) dfs3(i);
  }
  reverse(Ns.begin(), Ns.end());
  return;
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  G.resize(n, vector<long long>(0));
  Cost = G;
  Val = G;
  Rg = G;
  for (int i = 1; i < 1e5; i++) {
    Prog[i] = Prog[i - 1] + i;
    Sumprog[i] = Sumprog[i - 1] + Prog[i];
  }
  for (int i = 0; i < m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    Rg[b].push_back(a);
    G[a].push_back(b);
    Cost[a].push_back(c);
    long long pos = upper_bound(Prog.begin(), Prog.end(), c) - Prog.begin() - 1;
    Val[a].push_back((pos + 1) * c - Sumprog[pos]);
  }
  topsort();
  kras();
  Valcomp.resize(cou + 1, 0);
  GComp.resize(Valcomp.size(), vector<pair<int, long long>>(0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < G[i].size(); j++) {
      if (Comp[i] == Comp[G[i][j]])
        Valcomp[Comp[i]] += Val[i][j];
      else {
        GComp[Comp[i]].push_back({Comp[G[i][j]], Cost[i][j]});
      }
    }
  }
  int beg, nbeg;
  cin >> beg;
  beg--;
  nbeg = Comp[beg];
  vector<long long> Rast(Valcomp.size(), -1);
  Rast[nbeg] = Valcomp[nbeg];
  topsort2();
  long long ma = 0;
  for (int j = 0; j < GComp.size(); j++) {
    int v = Ns[j];
    if (Rast[v] == -1) continue;
    for (int i = 0; i < GComp[v].size(); i++) {
      if (Rast[GComp[v][i].first] <
          Rast[v] + GComp[v][i].second + Valcomp[GComp[v][i].first]) {
        Rast[GComp[v][i].first] =
            Rast[v] + GComp[v][i].second + Valcomp[GComp[v][i].first];
      }
    }
  }
  for (auto q : Rast)
    if (q > ma) ma = q;
  cout << ma;
}
