#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007LL;
long long large = 2000000000000000000LL;
vector<long long> pre(30010, 0);
vector<int> dfs_num, dfs_low, S, visited;
vector<vector<int> > adj;
vector<vector<int> > Scc;
int dfsNumberCounter = 0, numSCC = 0;
void tarjanSCC(int u) {
  dfs_low[u] = dfs_num[u] = dfsNumberCounter++;
  S.push_back(u);
  visited[u] = 1;
  for (int j = 0; j < (int)adj[u].size(); j++) {
    int v = adj[u][j];
    if (dfs_num[v] == -1) {
      tarjanSCC(v);
    }
    if (visited[v] == 1) {
      dfs_low[u] = min(dfs_low[u], dfs_low[v]);
    }
  }
  if (dfs_low[u] == dfs_num[u]) {
    Scc.push_back(vector<int>());
    while (true) {
      int v = S.back();
      S.pop_back();
      visited[v] = 0;
      Scc[numSCC].push_back(v);
      if (u == v) break;
    }
    numSCC++;
  }
}
vector<long long> val;
vector<vector<pair<int, long long> > > adj2;
vector<long long> dp;
long long get(long long x) {
  long long low = 0;
  long long high = x;
  long long ans = 0;
  while (low <= high) {
    long long mid = (low + high) / 2;
    if (mid * (mid - 1) / 2 <= x) {
      ans = mid;
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  return ans * x - pre[ans];
}
vector<vector<pair<int, long long> > > adj3;
long long f(int u) {
  if (dp[u] != -1) return dp[u];
  dp[u] = val[u];
  for (int j = 0; j < (int)adj3[u].size(); j++) {
    int v = adj3[u][j].first;
    long long z = adj3[u][j].second;
    dp[u] = max(dp[u], val[u] + z + f(v));
  }
  return dp[u];
}
int main() {
  for (long long i = 1; i < 30010LL; i++) {
    pre[i] = i * (i - 1) / 2;
    pre[i] += pre[i - 1];
  }
  int n, m;
  cin >> n >> m;
  adj.assign(n, vector<int>());
  adj2.assign(n, vector<pair<int, long long> >());
  for (int i = 0; i < m; i++) {
    int x, y;
    long long z;
    scanf("%d%d%I64d", &x, &y, &z);
    x--;
    y--;
    adj[x].push_back(y);
    adj2[x].push_back(pair<int, long long>(y, z));
  }
  dfs_num.assign(n, -1);
  dfs_low.assign(n, 0);
  visited.assign(n, 0);
  for (int i = 0; i < n; i++) {
    if (dfs_num[i] == -1) {
      tarjanSCC(i);
    }
  }
  vector<int> bel(n, 0);
  for (int i = 0; i < numSCC; i++) {
    for (int j = 0; j < (int)Scc[i].size(); j++) {
      bel[Scc[i][j]] = i;
    }
  }
  val.assign(numSCC, 0LL);
  adj3.assign(numSCC, vector<pair<int, long long> >());
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < (int)adj[i].size(); j++) {
      int v = adj2[i][j].first;
      long long z = adj2[i][j].second;
      if (bel[v] == bel[i]) {
        val[bel[i]] += get(z);
      } else {
        adj3[bel[i]].push_back(pair<int, long long>(bel[v], z));
      }
    }
  }
  dp.assign(numSCC, -1);
  int st;
  cin >> st;
  st--;
  cout << f(bel[st]) << endl;
  return 0;
}
