#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<cmath>#include<queue>#define maxn 10001+50using namespace std;int n;int c[maxn],dis[maxn];vector<int> g[maxn];vector<int> gg[maxn];queue<int> q;bool dfs(int u){ c[u]=-1; int sz=g[u].size(); for(int i=0;i<sz;i++){ if(c[g[u][i]]<0) return false; else if(!c[g[u][i]] && !dfs(g[u][i])) return false; } c[u]=1; return true;}bool toposort(){ for(int i=1;i<=n;i++) c[i]=0; for(int u=1;u<=n;u++) if(!c[u]) if(!dfs(u)) return false; return true;}void bfs(int u){ while(!q.empty()) q.pop(); q.push(u); while(!q.empty()){ int u=q.front(); q.pop(); int sz=gg[u].size(); for(int i=0;i<sz;i++){ int v=gg[u][i]; if(dis[u]<dis[v]) continue; else{ dis[v]=dis[u]+1; q.push(v); } } }}int solve(){ int s=0; for(int i=1;i<=n;i++) dis[i]=888; for(int i=1;i<=n;i++){ bfs(i); } for(int i=1;i<=n;i++) s+=dis[i]; return s;}int main(){ int m,u,v; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++) g[i].clear(),gg[i].clear(); for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); g[u].push_back(v); gg[v].push_back(u); } if(toposort()){ printf("%d\n",solve()); } else printf("-1\n"); } return 0;}