#include <bits/stdc++.h>
using
namespace
std;
vector<
int
> adj[100001];
vector<
int
> transpose[100001];
int
vis[100001], parent[100001], no[100001];
void
dfs(
int
node, vector<
int
> adj[], stack<
int
>& st,
int
vis[])
{
vis[node] = 1;
for
(
int
it : adj[node]) {
if
(vis[it] == 0) {
dfs(it, adj, st, vis);
}
}
st.push(node);
}
void
dfs_(
int
node, vector<
int
> transpose[],
int
vis[],
int
par)
{
vis[node] = 1;
parent[node] = par;
no[par]++;
for
(
int
it : transpose[node]) {
if
(vis[it] == 0) {
dfs_(it, transpose, vis, par);
}
}
}
void
dfs__(
int
node,
int
vis[], vector<
int
> adj[],
vector<
int
> adjn[],
int
parent[])
{
vis[node] = 1;
for
(
int
it : adj[node]) {
int
par1 = parent[node];
int
par2 = parent[it];
if
(par1 == par2) {
continue
;
}
adjn[par1].push_back(par2);
if
(vis[it] == 0) {
dfs__(it, vis, adj, adjn, parent);
}
}
}
int
countReachables(
int
N,
int
M, vector<pair<
int
,
int
> > V)
{
for
(
int
i = 0; i < M; i++) {
adj[V[i].first - 1].push_back(V[i].second - 1);
}
memset
(vis, 0,
sizeof
(vis));
stack<
int
> st;
for
(
int
i = 0; i < N; i++) {
if
(vis[i] == 0) {
dfs(i, adj, st, vis);
}
}
for
(
int
i = 0; i < N; i++) {
for
(
int
it : adj[i]) {
transpose[it].push_back(i);
}
}
memset
(vis, 0,
sizeof
(vis));
memset
(parent, 0,
sizeof
(parent));
memset
(no, 0,
sizeof
(no));
int
par = 0;
while
(!st.empty()) {
int
node = st.top();
st.pop();
if
(vis[node] == 0) {
dfs_(node, transpose, vis, par);
par++;
}
}
vector<
int
> adjn[100001];
memset
(vis, 0,
sizeof
(vis));
for
(
int
i = 0; i < N; i++) {
if
(vis[i] == 0) {
dfs__(i, vis, adj, adjn, parent);
}
}
int
outDegree = 0;
for
(
int
i = 0; i < par; i++) {
if
(adjn[i].size() == 0) {
outDegree++;
}
}
if
(outDegree > 1 || outDegree == 0) {
return
0;
}
else
{
for
(
int
i = 0; i < par; i++) {
if
(adjn[i].size() == 0) {
return
no[i];
}
}
return
0;
}
}
int
main()
{
int
N = 5;
int
M = 5;
int
V[M + 1][2] = {
{ 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 3 }, { 5, 4 }
};
vector<pair<
int
,
int
> > V_vec;
for
(
int
i = 0; i < M; i++) {
V_vec.push_back(make_pair(V[i][0], V[i][1]));
}
int
ans = countReachables(N, M, V_vec);
cout << ans;
return
0;
}