具体代码#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e2;
int in[N],ve[N],vl[N];
vector<pair<int,int> >e[N];
stack<int>toporder;
bool topologicalsort(int n){
queue<int>q;
for(int i=1;i<=n;i++){
if(!in[i])q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();toporder.push(u);
for(int i=0;i<e[u].size();i++){
int v=e[u][i].first,w=e[u][i].second;
if(--in[v]==0)q.push(v);
if(ve[u]+w>ve[v])ve[v]=ve[u]+w;
}
}
if(toporder.size()==n)return true;
else return false;
}
int criticalpath(int n){
memset(ve,0,sizeof(ve));
if(!topologicalsort(n)){
cout<<0;return 0;
}
int mx=-1;
for(int i=1;i<=n;i++){
if(ve[i]>mx)mx=ve[i];
}cout<<mx<<endl;
fill(vl+1,vl+n+1,mx);
while(!toporder.empty()){
int u=toporder.top();
toporder.pop();
for(int i=0;i<e[u].size();i++){
int v=e[u][i].first,w=e[u][i].second;
if(vl[v]-w<vl[u])vl[u]=vl[v]-w;
}
}
for(int i=1;i<=n;i++){
for(int j=e[i].size()-1;j>=0;j--){
int v=e[i][j].first,w=e[i][j].second;
int e=ve[i],l=vl[v]-w;
if(e==l)cout<<i<<"->"<<v<<endl;
}
}
}
int main(){
int n,m,x,y,z;
cin>>n>>m;
while(m--){
cin>>x>>y>>z;
in[y]++;
e[x].push_back({y,z});
}
criticalpath(n);
return 0;
}