#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 15;
int dfsPos, sccPos;
int order[N], scc[N];
vector<int> adj[N];
stack<int> st;
int dfs(int node) {
  int ret = order[node] = dfsPos++;
  st.push(node);
  for (int nextNode : adj[node]) {
    if (nextNode == node) {
      continue;
    }
    if (order[nextNode] == 0) {
      ret = min(ret, dfs(nextNode));
    } else if (scc[nextNode] == -1) {
      ret = min(ret, order[nextNode]);
    }
  }
  if (ret == order[node]) {
    while (true) {
      int cur = st.top();
      st.pop();
      scc[cur] = sccPos;
      if (cur == node) {
        break;
      }
    }
    ++sccPos;
  }
  return ret;
}
long long dp[N], value[N];
vector<pair<int, int> > ne[N];
long long dfs2(int node) {
  long long& ret = dp[node];
  if (ret != -1) {
    return ret;
  }
  ret = 0;
  for (pair<int, int> e : ne[node]) {
    ret = max(ret, dfs2(e.second) + e.first);
  }
  ret += value[node];
  return ret;
}
int x[N], y[N], w[N];
long long t[N], tsum[N];
void solve2() {
  dfsPos = 1;
  sccPos = 0;
  memset(scc, -1, sizeof(scc));
  int n, m;
  scanf(" %d %d ", &n, &m);
  for (int i = 0; i < m; ++i) {
    scanf("%d  %d %d ", &x[i], &y[i], &w[i]);
    adj[x[i]].push_back(y[i]);
  }
  for (int i = 1; i <= N; ++i) {
    t[i] = t[i - 1] + i;
    tsum[i] = tsum[i - 1] + t[i];
  }
  int s;
  scanf("%d ", &s);
  dfs(s);
  memset(dp, -1, sizeof(dp));
  for (int i = 0; i < m; ++i) {
    int u = x[i], v = y[i];
    if (order[u] && order[v]) {
      if (scc[u] != scc[v]) {
        ne[scc[u]].push_back({w[i], scc[v]});
      } else {
        int l = 0, r = 1e5, mid;
        while (l < r) {
          mid = (l + r + 1) / 2;
          if (t[mid] <= w[i])
            l = mid;
          else
            r = mid - 1;
        }
        value[scc[u]] += (long long)(l + 1) * w[i] - tsum[l];
      }
    }
  }
  printf("%lld\n", dfs2(scc[s]));
}
void solve() {
  int t;
  solve2();
}
inline bool exists_test0(const std::string& name);
inline bool exists_test1(const std::string& name);
int main() {
  solve();
  return 0;
}
inline bool exists_test0(const std::string& name) {
  ifstream f(name.c_str());
  return f.good();
}
inline bool exists_test1(const std::string& name) {
  if (FILE* file = fopen(name.c_str(), "r")) {
    fclose(file);
    return true;
  } else {
    return false;
  }
}
