#include <bits/stdc++.h>
using namespace std;
const long long int N = 1e6 + 10, inf = 1e16;
long long int n, m, a[N], b[N], c[N], mark[N], cnt = 0, x, y, su[N], sum, we,
                                               cmp[N], d[N], start, k;
stack<long long int> s;
vector<long long int> adj[N], radj[N], v[N], g[N];
queue<long long int> q;
void add_edge(int x, int y) {
  adj[x].push_back(y);
  radj[y].push_back(x);
}
void dfs(int x) {
  mark[x] = 1;
  for (auto y : adj[x])
    if (!mark[y]) dfs(y);
  s.push(x);
}
void dfs_back(long long int x, long long int c) {
  mark[x] = 1;
  cmp[x] = c;
  for (auto y : radj[x])
    if (!mark[y]) dfs_back(y, c);
}
long long int bin(long long int w) {
  long long int r, l, x;
  r = 1e8;
  l = 0;
  while (r - l > 1) {
    x = (r + l) / 2;
    if (x * (x - 1) / 2 > w)
      r = x;
    else
      l = x;
  }
  if (r * (r - 1) / 2 <= w)
    return r;
  else
    return l;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> a[i] >> b[i] >> c[i];
    add_edge(a[i], b[i]);
  }
  for (int i = 1; i <= n; i++)
    if (!mark[i]) dfs(i);
  fill(mark, mark + N, 0);
  while ((long long int)s.size()) {
    x = s.top(), s.pop();
    if (!mark[x]) {
      cnt++;
      dfs_back(x, cnt);
    }
  }
  fill(mark, mark + N, 0);
  fill(su, su + N, 0);
  for (int i = 1; i <= m; i++) {
    x = a[i];
    y = b[i];
    we = c[i];
    if (cmp[x] == cmp[y]) {
      k = bin(we);
      sum = k * we;
      sum -= (k - 1) * k * (k + 1) / 6;
      su[cmp[x]] += sum;
    } else {
      v[cmp[y]].push_back(cmp[x]);
      g[cmp[y]].push_back(we);
      d[cmp[x]]++;
    }
  }
  cin >> start;
  for (int i = 1; i <= cnt; i++)
    if (d[i] == 0) q.push(i);
  while (!q.empty()) {
    x = q.front(), q.pop();
    su[x] += mark[x];
    for (int i = 0; i < v[x].size(); i++) {
      y = v[x][i];
      d[y]--;
      mark[y] = max(mark[y], su[x] + g[x][i]);
      if (d[y] == 0) q.push(y);
    }
  }
  cout << su[cmp[start]] << endl;
  return 0;
}
