#include using namespace std; const int maxn=1000+5; bitsetp[maxn]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) p[i][i]=1; while(m--) { int u,v; cin>>u>>v; p[u][v]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(p[i][k]) p[i]|=p[k]; int ans=0; for(int i=1;i<=n;i++) ans+=p[i].count(); cout< //using namespace std; //const int maxn=1000+5,maxm=10000+5; //int head[maxn],next[maxm],to[maxm]; //bool vis[maxn]; //int n,m,x,y,total; //bitsetp[maxn]; // //void add(int u,int v)//添加一条u--v的边 //{ // next[++total]=head[u]; // head[u]=total; // to[total]=v; //} // //void dfs(int u) //{ // p[u][u]=1; // vis[u]=true; // int v; // for(register int i=head[u];i;i=next[i]) // { // v=to[i]; // if(!vis[v]) // dfs(v); // p[u]|=p[v];//或运算,有一个是1即为1,得到u和其它结点的关系 // } //} // //int main() //{ // cin>>n>>m; // while(m--) // { // cin>>x>>y; // add(x,y); // p[x][y]=1; // } // for(register int i=1;i<=n;i++) // if(!vis[i]) // dfs(i); // int ans=0; // for(register int i=1;i<=n;i++) // { // //cout<