CODE
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
//#define test
const int maxn = 10000+10;
int n,m;
int topo[maxn];
int in[maxn];
vector<int> G[maxn];
int sum;
int arr[maxn];
struct cmp{
bool operator()(int &a,int &b){
return a < b;
}
};
void topo_sort(){
queue<int> Q;
memset(arr,-1,sizeof(arr));
for(int i=1;i<=n;i++)
if(!in[i]){
Q.push(i); arr[i]=0;
}
while(!Q.empty()){
int u=Q.front(); Q.pop();
topo[ ++topo[0] ]=u;
for(int v=0 ; v<G[u].size() ; v++){
in[ G[u][v] ]--;
if(in[ G[u][v] ]==0){
Q.push( G[u][v] );
arr[ G[u][v] ]=arr[u]+1;
}
}
}
}
int main(){
int a,b;
#ifdef test
freopen("Hdu 2647.txt","r",stdin);
#endif
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1 ; i<=n ; i++) G[i].clear();
memset(in,0,sizeof(in));
memset(topo,0,sizeof(topo));
for(int i=1 ; i<=m ; i++){
scanf("%d%d",&a,&b);
G[b].push_back(a); // b指向a
in[a]++;
}
topo_sort();
sum=0;
if(topo[0]!=n) printf("-1\n");
else{
for(int i=1 ; i<=n ; i++)
sum+=arr[i];
printf("%d\n",sum+(n*888));
}
}
return 0;
}
/*
Test Data:
5 4
2 1
3 2
1 3
1 4
5 4
3 2
2 1
1 4
4 5
3 1
1 2
3 3
1 2
2 3
3 1
4 4
1 2
2 3
1 4
3 4
*/