#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000 * 1000 + 1;
int N, M, S;
pair<int, int> edges_list[MAXN];
vector<int> adjl[MAXN];
vector<int> tadjl[MAXN];
list<int> l;
bool visited[MAXN];
bool assigned[MAXN];
unordered_map<int, vector<int> > components;
int componentOf[MAXN];
unordered_map<int, long long> components_sum;
vector<pair<int, int> > sccadjl[MAXN];
long long dp[MAXN];
void visit(int node) {
  visited[node] = true;
  for (auto it : adjl[node]) {
    if (!visited[edges_list[it].first]) {
      visit(edges_list[it].first);
    }
  }
  l.push_front(node);
  return;
}
void assign(int node, int root) {
  components[root].push_back(node);
  componentOf[node] = root;
  assigned[node] = true;
  for (auto it : tadjl[node]) {
    if (!assigned[it]) {
      assign(it, root);
    }
  }
  return;
}
long long get_total(int mushrooms) {
  long long passages =
      (long long)floor((sqrt(1 + 8 * (double)mushrooms) - 1) / 2);
  long long total =
      mushrooms * (passages + 1) -
      (passages + 1) * (3 * passages + passages * (2 * passages + 1)) / 12;
  return total;
}
long long f(int scc_node) {
  if (dp[scc_node] != -1) return dp[scc_node];
  long long ans = 0;
  for (auto it : sccadjl[scc_node]) {
    ans = max(ans, f(it.first) + it.second);
  }
  ans += components_sum[scc_node];
  return dp[scc_node] = ans;
}
int main() {
  memset(dp, -1, sizeof dp);
  scanf("%d %d", &N, &M);
  for (unsigned i = 0; i < M; ++i) {
    int x, y, w;
    scanf("%d %d %d", &x, &y, &w);
    edges_list[i] = pair<int, int>(y, w);
    adjl[x].push_back(i);
    tadjl[y].push_back(x);
  }
  scanf("%d", &S);
  for (unsigned i = 1; i <= N; ++i) {
    if (!visited[i]) visit(i);
  }
  for (auto it : l) {
    if (!assigned[it]) assign(it, it);
  }
  for (unsigned i = 1; i <= N; ++i) {
    int this_comp = componentOf[i];
    for (auto it : adjl[i]) {
      pair<int, int> edge = edges_list[it];
      if (componentOf[edge.first] == this_comp) {
        components_sum[this_comp] += get_total(edge.second);
      } else {
        sccadjl[this_comp].push_back(
            pair<int, int>(componentOf[edge.first], edge.second));
      }
    }
  }
  printf("%lld\n", f(componentOf[S]));
  return 0;
}
