/* 强连通缩点后得到一个拓扑图 把这个拓扑图取反,在图上进行dp,最后dp[s]就是答案 */ #include<bits/stdc++.h> using namespace std; #define N 2000006 #define ll long long struct Edge{ ll to,w,nxt; }e[N<<1],e_n[N<<1]; int n,m,head[N],tot,head_n[N],tot_n; void init(){ memset(head,-1,sizeof head); memset(head_n,-1,sizeof head_n); tot=tot_n=0; } void add(int u,int v,ll w){ e[tot].w=w; e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } void add_n(int u,int v,ll w){ e_n[tot_n].w=w; e_n[tot_n].to=v; e_n[tot_n].nxt=head_n[u]; head_n[u]=tot_n++; } ll F[N]; vector<int>scc[N]; int c[N],cnt,low[N],dfn[N],ins[N],stk[N],ind,top; void tarjan(int x){ low[x]=dfn[x]=++ind; ins[x]=1;stk[++top]=x; for(int i=head[x];i!=-1;i=e[i].nxt){ int y=e[i].to; if(!dfn[y]){ tarjan(y); low[x]=min(low[x],low[y]); } else if(ins[y]) low[x]=min(low[x],dfn[y]); } if(low[x]==dfn[x]){ cnt++;int y; do{ y=stk[top--]; scc[cnt].push_back(y); c[y]=cnt;ins[y]=0; }while(y!=x); } } ll val[N],dp[N]; int in[N],vis[N]; inline ll calc(ll x){ ll L=0,R=1e8,mid,ans; while(L<=R){ mid=L+R>>1; if(mid*(mid+1)/2<=x) ans=mid,L=mid+1; else R=mid-1; } return x*(ans+1)-F[ans]; } int main(){ init(); for(int i=1;i<=1000000;i++)F[i]=i; for(int i=1;i<=1000000;i++)F[i]+=F[i-1]; for(int i=1;i<=1000000;i++)F[i]+=F[i-1]; cin>>n>>m; for(int i=1;i<=m;i++){ ll u,v,w;scanf("%lld%lld%lld",&u,&v,&w); add(u,v,w); } //缩点 for(int i=1;i<=n;i++) if(!dfn[i])tarjan(i); //建立新图 for(int u=1;u<=n;u++) for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(c[u]==c[v]) val[c[u]]+=calc(e[i].w); else{ add_n(c[v],c[u],e[i].w);//建的是反图 in[c[u]]++; } } queue<int>q; for(int i=1;i<=cnt;i++) if(in[i]==0){ q.push(i);vis[i]=1;dp[i]=val[i]; } while(q.size()){ int u=q.front();q.pop(); for(int i=head_n[u];i!=-1;i=e_n[i].nxt){ int v=e_n[i].to; if(vis[v])continue; dp[v]=max(dp[v],dp[u]+e_n[i].w); in[v]--; if(in[v]==0){ q.push(v); dp[v]+=val[v]; vis[v]=1; } } } int s;cin>>s; cout<<dp[c[s]]<<' '; }