#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1000007;
struct Edge {
  int to;
  long long w;
  Edge(int _to, long long _w) : to(_to), w(_w) {}
};
vector<Edge> graphA[MAX_N], graphB[MAX_N], graphC[MAX_N];
vector<int> order;
int n, m, sccCount = 0, start, scc[MAX_N];
long long sccValue[MAX_N], best[MAX_N];
bool visited[MAX_N];
long long maxValue(long long x) {
  long long beg = 0, end = x;
  while (beg <= end) {
    long long mid = (beg + end) / 2;
    if (x >= mid * (mid + 1) / 2)
      beg = mid + 1;
    else
      end = mid - 1;
  }
  long long t = beg - 1;
  return x * (t + 1) - (t - 1) * t * (t + 1) / 2 +
         t * (t + 1) * (2 * t + 1) / 6 - t * (t + 1);
}
void DFS1(int x) {
  visited[x] = true;
  for (Edge e : graphA[x])
    if (!visited[e.to]) DFS1(e.to);
  order.push_back(x);
}
void DFS2(int x) {
  scc[x] = sccCount;
  visited[x] = true;
  for (Edge e : graphB[x])
    if (!visited[e.to]) DFS2(e.to);
}
void DFS3(int x) {
  visited[x] = true;
  for (Edge e : graphC[x])
    if (!visited[e.to]) DFS3(e.to);
  order.push_back(x);
}
void MakeGraphC() {
  fill(visited, visited + n, false);
  for (int i = 0; i < n; i++)
    if (!visited[i]) DFS1(i);
  fill(visited, visited + n, false);
  while (!order.empty()) {
    if (!visited[order.back()]) {
      DFS2(order.back());
      sccCount++;
    }
    order.pop_back();
  }
  for (int i = 0; i < n; i++) {
    for (Edge e : graphA[i]) {
      if (scc[i] == scc[e.to]) {
        sccValue[scc[i]] += maxValue(e.w);
      } else {
        graphC[scc[i]].push_back(Edge(scc[e.to], e.w));
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b, w;
    cin >> a >> b >> w;
    graphA[a - 1].push_back(Edge(b - 1, w));
    graphB[b - 1].push_back(Edge(a - 1, w));
  }
  cin >> start;
  MakeGraphC();
  fill(visited, visited + sccCount, false);
  DFS3(scc[start - 1]);
  fill(best, best + sccCount, -1);
  reverse(order.begin(), order.end());
  best[scc[start - 1]] = 0;
  for (int x : order) {
    if (best[x] != -1) {
      for (Edge e : graphC[x]) {
        best[e.to] = max(best[e.to], best[x] + sccValue[x] + e.w);
      }
    }
  }
  long long hi = 0;
  for (int i = 0; i < sccCount; i++)
    if (visited[i]) hi = max(hi, best[i] + sccValue[i]);
  cout << hi << '\n';
  return 0;
}
