#include typedef struct list { int v; int id; int f; struct list *n; } list; int func (int v, list **e, int *ans, int *flag) { list *l = e[v]; if (flag[v] > 0) { return v; } flag[v] = 1; while (l != NULL) { int res = func(l->v, e, ans, flag); l->f = 1; if (res >= 0) { ans[l->id] = 1; if (res != v) { flag[v] = 0; e[v] = l->n; return res; } } l = l->n; } e[v] = NULL; flag[v] = 0; return -1; } int main () { int n = 0; int m = 0; int u[300000] = {}; int v[300000] = {}; int res = 0; int ans[300000] = {}; int flag[300000] = {}; list pool[300000] = {}; list *e[300000] = {}; int ans_m = 0; res = scanf("%d", &n); res = scanf("%d", &m); for (int i = 0; i < m; i++) { res = scanf("%d", u+i); res = scanf("%d", v+i); pool[i].v = v[i]-1; pool[i].id = i; pool[i].f = 0; pool[i].n = e[u[i]-1]; e[u[i]-1] = pool+i; } for (int i = 0; i < n; i++) { res = func(i, e, ans, flag); } for (int i = 0; i < m; i++) { ans_m += 1-ans[i]; } printf("%d %d\n", n, ans_m); for (int i = 0; i < m; i++) { if (ans[i] <= 0) { printf("%d %d\n", u[i], v[i]); } } return 0; }