// Enjoy your stay.
#include <bits/stdc++.h>
#define EPS 1e-9
#define INF 1070000000LL
#define MOD 1000000007LL
#define fir first
#define foreach(it,X) for(auto it=(X).begin();it!=(X).end();it++)
#define ite iterator
#define mp make_pair
#define mt make_tuple
#define rep(i,n) rep2(i,0,n)
#define rep2(i,m,n) for(int i=m;i<(n);i++)
#define pb push_back
#define sec second
#define sz(x) ((int)(x).size())
using namespace std;
typedef istringstream iss;
typedef long long ll;
typedef pair<ll,ll> pi;
typedef stringstream sst;
typedef vector<ll> vi;
const int N = 100010;
int n, m;
vi g[N];
vi rg[N];
vi vs;
bool used[N];
int cmp[N], cmpsize[N];
void add_edge(int from, int to){
g[from].pb(to);
rg[to].pb(from);
}
void dfs(int v){
used[v] = 1;
rep(i, sz(g[v])){
if(!used[g[v][i]]) dfs(g[v][i]);
}
vs.pb(v);
}
void rdfs(int v, int k){
used[v] = 1;
cmp[v] = k;
rep(i, sz(rg[v])){
if(!used[rg[v][i]]) rdfs(rg[v][i], k);
}
}
int scc(){
memset(used, 0, sizeof(used));
vs.clear();
rep(v, n){
if(!used[v])
dfs(v);
}
memset(used, 0, sizeof(used));
int k = 0;
for(int i = sz(vs) - 1; i >= 0; i--){
if(!used[vs[i]]) rdfs(vs[i], k++);
}
return k;
}
int dfs2(int v){
used[v] = 1;
int res = cmpsize[cmp[v]] == 1;
rep(i,sz(g[v])) if(!used[g[v][i]]){
res &= dfs2(g[v][i]);
}
rep(i,sz(rg[v])) if(!used[rg[v][i]]){
res &= dfs2(rg[v][i]);
}
cout << res << endl;
return res;
}
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> n >> m;
rep(i, m){
int a, b;
cin >> a >> b;
add_edge(a-1, b-1);
}
scc();
memset(cmpsize, 0, sizeof(cmpsize));
rep(i, n){
cmpsize[cmp[i]]++;
}
memset(used, 0, sizeof(used));
int ans = n;
rep(i, n) if(!used[i]){
int x = dfs2(i);
cout << x << ' ';
ans -= x;
}
cout << ans << endl;
}
Ly8gRW5qb3kgeW91ciBzdGF5LgoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIEVQUyAxZS05CiNkZWZpbmUgSU5GIDEwNzAwMDAwMDBMTAojZGVmaW5lIE1PRCAxMDAwMDAwMDA3TEwKI2RlZmluZSBmaXIgZmlyc3QKI2RlZmluZSBmb3JlYWNoKGl0LFgpIGZvcihhdXRvIGl0PShYKS5iZWdpbigpO2l0IT0oWCkuZW5kKCk7aXQrKykKI2RlZmluZSBpdGUgaXRlcmF0b3IKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBtdCBtYWtlX3R1cGxlCiNkZWZpbmUgcmVwKGksbikgcmVwMihpLDAsbikKI2RlZmluZSByZXAyKGksbSxuKSBmb3IoaW50IGk9bTtpPChuKTtpKyspCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgc2VjIHNlY29uZAojZGVmaW5lIHN6KHgpICgoaW50KSh4KS5zaXplKCkpCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBpc3RyaW5nc3RyZWFtIGlzczsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxsbCxsbD4gcGk7CnR5cGVkZWYgc3RyaW5nc3RyZWFtIHNzdDsKdHlwZWRlZiB2ZWN0b3I8bGw+IHZpOwoKY29uc3QgaW50IE4gPSAxMDAwMTA7CgppbnQgbiwgbTsKdmkgZ1tOXTsKdmkgcmdbTl07CnZpIHZzOwpib29sIHVzZWRbTl07CmludCBjbXBbTl0sIGNtcHNpemVbTl07Cgp2b2lkIGFkZF9lZGdlKGludCBmcm9tLCBpbnQgdG8pewoJZ1tmcm9tXS5wYih0byk7CglyZ1t0b10ucGIoZnJvbSk7Cn0KCnZvaWQgZGZzKGludCB2KXsKCXVzZWRbdl0gPSAxOwoJcmVwKGksIHN6KGdbdl0pKXsKCQlpZighdXNlZFtnW3ZdW2ldXSkgZGZzKGdbdl1baV0pOwoJfQoJdnMucGIodik7Cn0KCnZvaWQgcmRmcyhpbnQgdiwgaW50IGspewoJdXNlZFt2XSA9IDE7CgljbXBbdl0gPSBrOwoJcmVwKGksIHN6KHJnW3ZdKSl7CgkJaWYoIXVzZWRbcmdbdl1baV1dKSByZGZzKHJnW3ZdW2ldLCBrKTsKCX0KfQoKaW50IHNjYygpewoJbWVtc2V0KHVzZWQsIDAsIHNpemVvZih1c2VkKSk7Cgl2cy5jbGVhcigpOwoJcmVwKHYsIG4pewoJCWlmKCF1c2VkW3ZdKQoJCWRmcyh2KTsKCX0KCW1lbXNldCh1c2VkLCAwLCBzaXplb2YodXNlZCkpOwoJaW50IGsgPSAwOwoJZm9yKGludCBpID0gc3oodnMpIC0gMTsgaSA+PSAwOyBpLS0pewoJCWlmKCF1c2VkW3ZzW2ldXSkgcmRmcyh2c1tpXSwgaysrKTsKCX0KCXJldHVybiBrOwp9CgppbnQgZGZzMihpbnQgdil7Cgl1c2VkW3ZdID0gMTsKCWludCByZXMgPSBjbXBzaXplW2NtcFt2XV0gPT0gMTsKCXJlcChpLHN6KGdbdl0pKSBpZighdXNlZFtnW3ZdW2ldXSl7CgkJcmVzICY9IGRmczIoZ1t2XVtpXSk7Cgl9CglyZXAoaSxzeihyZ1t2XSkpIGlmKCF1c2VkW3JnW3ZdW2ldXSl7CgkJcmVzICY9IGRmczIocmdbdl1baV0pOwoJfQoJY291dCA8PCByZXMgPDwgZW5kbDsKCXJldHVybiByZXM7Cn0KCmludCBtYWluKCl7CgljaW4udGllKDApOwoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCQoJY2luID4+IG4gPj4gbTsKCXJlcChpLCBtKXsKCQlpbnQgYSwgYjsKCQljaW4gPj4gYSA+PiBiOwoJCWFkZF9lZGdlKGEtMSwgYi0xKTsKCX0KCXNjYygpOwoJbWVtc2V0KGNtcHNpemUsIDAsIHNpemVvZihjbXBzaXplKSk7CglyZXAoaSwgbil7CgkJY21wc2l6ZVtjbXBbaV1dKys7Cgl9CgltZW1zZXQodXNlZCwgMCwgc2l6ZW9mKHVzZWQpKTsKCWludCBhbnMgPSBuOwoJcmVwKGksIG4pIGlmKCF1c2VkW2ldKXsKCQlpbnQgeCA9IGRmczIoaSk7CgkJY291dCA8PCB4IDw8ICcgJzsKCQlhbnMgLT0geDsKCX0KCWNvdXQgPDwgYW5zIDw8IGVuZGw7Cn0=