stack<int> toporder;
bool toplogicalsort(){
queue<int> q;
for(int i=0;i<n;i++){
if(indegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u = q.front();
q.pop();
toporder.push(u);
for(int i=0;i<g[u].size();i++){
int v = g[u][i].v;
indegree[v]--;
if(indegree[v]==0){
q.push(v);
}
if(ve[u]+g[u][i].w>ve[v]){
ve[v] = ve[u]+g[u][i].w;
}
}
}
if(toporder.size()==n) return true;
else return false;
}
fill(vl,vl+n,ve[n-1]);
while(!toporder.empty()){
int u = toporder.top();
toporder.pop();
for(int i=0;i<g[u].size();i++){
if(vl[v]-g[u][i].w<vl[u]){
vl[u] = vl[v] - g[u][i].w
}
}
}
int criticalpath(){
memset(ve,0,sizeof(ve));
if(toplogicalsort()==false){
return -1;
}
fill(vl,vl+n,ve[n-1]);
while(!toporder.empty()){
int u = toporder.top();
toporder.pop();
for(int i=0;i<g[u].size();i++){
int v = g[u][i].v;
if(vl[v]-g[u][i].w<vl[u]){
vl[u] = vl[v] - g[u][i].w;
}
}
}
for(int u =0;u<n;u++){
for(int i=0;i<g[u].size();i++){
int v = g[u][i].v,w=g[u][i].w;
int e = ve[u],l=vl[v]-w;
if(e==l){
printf("%d->%d\n",u,v);
}
}
}
return ve[n-1];
}