#include<stdio.h> int m[10010][1000],g[10010],v[10010]; int n,l; int find(int i) { int max=887,j,ret; if(v[i])//进入那个节点就标记,出去的时候消掉,实际上这里存的就是深搜的栈 return 0;//栈中出现重复访问,及出现环,返回0表示出错 v[i]=1;//未形成环,标志它 for(j=1;j<=m[i][0];j++)//找他前驱的最大工资 { if(g[m[i][j]]==0)//前驱有未定工资的 { ret=find(m[i][j]); if(ret==0)//前驱出错,直接返回0 { v[i]=0;//***忘了在出错的时候也要恢复标志 return 0; } } if(g[m[i][j]]>max) max=g[m[i][j]]; } g[i]=max+1;//他的工资比前驱的最大数大1 v[i]=0;//消除访问标志 return 1;//操作成功 } int main() { int i,a,b; while(scanf("%d%d",&n,&l)!=EOF) { for(i=1;i<=n;i++) { m[i][0]=0; g[i]=0; } for(i=0;i<l;i++) { scanf("%d%d",&a,&b); m[a][0]++; m[a][m[a][0]]=b; } for(i=n;i>0;i--) { if(g[i]==0) { a=find(i); if(!a) break; } } if(!i) { b=0; for(i=1;i<=n;i++) b+=g[i]; printf("%d\n",b); } else { printf("-1\n"); } } return 0; }