#include <bits/stdc++.h>
using namespace std;
int V;
const int maxv = 1000010;
vector<int> G[maxv], rG[maxv], vs;
bool used[maxv];
int cmp[maxv];
void add_edge(int from, int to) {
  G[from].push_back(to);
  rG[to].push_back(from);
}
void dfs(int v) {
  used[v] = true;
  for (int i = 0; i < G[v].size(); i++) {
    if (!used[G[v][i]]) dfs(G[v][i]);
  }
  vs.push_back(v);
}
void rdfs(int v, int k) {
  used[v] = true;
  cmp[v] = k;
  for (int i = 0; i < rG[v].size(); i++) {
    if (!used[rG[v][i]]) rdfs(rG[v][i], k);
  }
}
int scc() {
  memset(used, 0, sizeof(used));
  vs.clear();
  for (int v = 1; v <= V; v++) {
    if (!used[v]) dfs(v);
  }
  memset(used, 0, sizeof(used));
  int k = 0;
  for (int i = vs.size() - 1; i >= 0; i--) {
    if (!used[vs[i]]) rdfs(vs[i], k++);
  }
  return k;
}
const int sn = 22000;
long long sum[sn], accSum[sn];
void init_sum() {
  sum[0] = accSum[sn] = 0;
  for (int i = 1; i < sn; i++) sum[i] = sum[i - 1] + i;
  for (int i = 1; i < sn; i++) accSum[i] = accSum[i - 1] + sum[i];
}
long long calWeight(int x) {
  int k = upper_bound(sum, sum + sn, x) - sum - 1;
  return (long long)(k + 1) * x - accSum[k];
}
long long shrink_vertex_weight[maxv], dp[maxv];
int sV;
vector<int> shrink_graph[maxv];
map<pair<int, int>, long long> shrink_edge_weight;
struct edge {
  int from, to, weight;
};
edge edges[maxv];
void update(long long &a, long long b) {
  if (b > a) a = b;
}
long long f(int v) {
  if (dp[v] > -1) return dp[v];
  long long reward = 0;
  for (auto i : shrink_graph[v]) {
    update(reward, shrink_edge_weight[pair<int, int>(v, i)] + f(i));
  }
  return dp[v] = shrink_vertex_weight[v] + reward;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  init_sum();
  int n, m;
  cin >> n >> m;
  V = n;
  for (int i = 0; i < m; i++) {
    int from, to, weight;
    cin >> from >> to >> weight;
    add_edge(from, to);
    edges[i] = edge{from, to, weight};
  }
  int start;
  cin >> start;
  sV = scc();
  for (int i = 0; i < m; i++) {
    int v1 = edges[i].from, v2 = edges[i].to;
    if (cmp[v1] == cmp[v2]) {
      shrink_vertex_weight[cmp[v1]] += calWeight(edges[i].weight);
    } else {
      update(shrink_edge_weight[pair<int, int>(cmp[v1], cmp[v2])],
             edges[i].weight);
      shrink_graph[cmp[v1]].push_back(cmp[v2]);
    }
  }
  memset(dp, -1, sizeof(dp));
  cout << f(cmp[start]) << endl;
}
