func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long read() {     long long s = 0, f = 1;     char c = getchar();     while (c <  0  || c >  9 ) f *= c ==  -  ? -1 : 1, c = getchar();     while (c >=  0  && c <=  9 ) s = s * 10 + c -  0 , c = getchar();     return s * f;   }   struct edge {     int from, nxt, to;     long long val;   };   struct graph {     edge e[1000005 << 1];     int head[2000005], ind[2000005], tot;     inline void addedge(int u, int v, long long w) {       ind[v]++;       e[++tot] = (edge){u, head[u], v, w}, head[u] = tot;     }   } G;   class SCC : public graph {     stack<int> s;     int pre[2000005], low[2000005], dfn;     bool vis[2000005];     void dfs(int u) {       pre[u] = low[u] = ++dfn;       s.push(u);       for (int i = head[u]; i; i = e[i].nxt) {         int v = e[i].to;         if (!pre[v])           dfs(v), low[u] = min(low[u], low[v]);         else if (!scc[v])           low[u] = min(low[u], pre[v]);       }       if (low[u] == pre[u]) {         int x;         cnt++;         do x = s.top(), s.pop(), scc[x] = cnt;         while (x != u);       }     }       public:     int cnt, scc[2000005];     inline void tarjan(int n) {       for (int i = 1; i <= n; i++)         if (!pre[i]) dfs(i);     }     inline void init() {       memset(head, 0, sizeof(head));       memset(pre, 0, sizeof(pre));       memset(low, 0, sizeof(low));       memset(scc, 0, sizeof(scc));       tot = dfn = cnt = 0;       while (!s.empty()) s.pop();     }   } G1;   inline long long calc(long long x) {     long long t = sqrt(2 * x + 0.25) - 0.5;     return x + t * x - (t + 1) * (t + 2) * t / 6;   }   int n, m, s;   long long val[2000005], dis[2000005];   bool vis[2000005];   queue<int> q;   int main() {     n = read(), m = read();     for (register int i = (1); i <= (m); i++) {       int u = read(), v = read();       long long w = read();       G1.addedge(u, v, w);     }     G1.tarjan(n);     s = G1.scc[read()];     for (register int i = (1); i <= (m); i++) {       edge e = G1.e[i];       int u = G1.scc[e.from], v = G1.scc[e.to];       if (u == v)         val[u] += calc(e.val);       else         G.addedge(u, v, e.val);     }     int N = G1.cnt;     memset(dis, -1, sizeof(dis));     q.push(s), dis[s] = val[s], vis[s] = 1;     while (!q.empty()) {       int u = q.front();       q.pop();       vis[u] = 0;       for (int i = G.head[u]; i; i = G.e[i].nxt) {         edge e = G.e[i];         int v = e.to;         if (dis[v] < dis[u] + e.val + val[v]) {           dis[v] = dis[u] + e.val + val[v];           if (!vis[v]) q.push(v), vis[v] = 1;         }       }     }     for (register int i = (1); i <= (N); i++) dis[0] = max(dis[0], dis[i]);     cout << dis[0];     return 0;   }   