from types import GeneratorType def bootstrap(f, stack=[]): def wrappedfunc(*args, **kwargs): if stack: return f(*args, **kwargs) to = f(*args, **kwargs) while True: if type(to) is GeneratorType: stack.append(to) to = next(to) else: stack.pop() if not stack: break to = stack[-1].send(to) return to return wrappedfunc N, M = map(int, input().split()) G = [[] for _ in range(N)] for _ in range(M): u, v = map(int, input().split()) u, v = u-1, v-1 G[u].append(v) @bootstrap def dfs(n): S.add(n) while G[n]: v = G[n].pop() if v in S: S.remove(n) yield v s = yield dfs(v) if s != -1: if s != n: S.remove(n) yield s else: ans.append((n, v)) S.remove(n) yield -1 ans = [] S = set() for i in range(N): dfs(i) print(N, len(ans)) for u, v in ans: print(u+1, v+1)