#include <bits/stdc++.h>
#define MAXN 1000010
using namespace std;
long long n, m, s;
long long dist[MAXN], head[MAXN], tot, maxn, l;
bool flag[MAXN];
struct Edge{
int next, to, w;
};
Edge edge[MAXN];
void add_edge(long long x, long long y, long long z) {
edge[tot].to = y;
edge[tot].w = z;
edge[tot].next = head[x];
head[x] = tot ++;
}
void dijkstra() {
priority_queue<pair<long long, long long>>que;
dist[1] = 0;
que.push(make_pair(0, 1));
while(!que.empty()) {
int x = que.top().second;
que.pop();
if (flag[x]) continue;
flag[x] = true;
for (long long i = head[x]; i != -1; i = edge[i].next) {
long long j = edge[i].to;
if (flag[j] == false && dist[x] + edge[i].w < dist[j]) {
dist[j] = dist[x] + edge[i].w;
que.push(make_pair(-dist[j], j));
}
}
}
}
int main() {
scanf("%lld%lld", &n, &m);
memset(head, -1, sizeof(head));
for (int i = 1; i <= n; i++) {
dist[i] = 2147483647;
}
memset(flag, 0, sizeof(flag));
for (long long i = 1; i <= m; i++) {
int x1, y1, z1;
cin >> x1 >> y1;
add_edge(x1, y1, 1);
}
dijkstra();
for (long long i = 1; i <= n; i++) {
maxn = max(maxn, dist[i]);
}
for (long long i = 1; i <= n; i++) {
if (dist[i] == maxn) {
printf("%lld", i);
break;
}
}
printf(" %lld", maxn);
for (int i = 1; i <= n; i++) {
if (dist[i] == maxn) l ++;
}
printf(" %lld", l);
return 0;
}
求求帮我看看