20 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 10 4
0 1 4 2 7 0 10 0 5 8
 10 7
10 8 6 5 0 0 0 4 3 9
 10 1
8 7 0 2 0 10 0 0 3 5
 10 7
7 9 2 10 0 0 0 3 5 1
 10 2
10 0 9 0 0 4 2 6 8 0
 10 2
0 7 0 10 8 0 4 2 3 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 3
4
8
9
 1
5
6
10
 2
4
5
7
8
10
 1
2
6
7
 1
2
3
4
6
7
8
9
 4
5
6
7
8

#include <bits/stdc++.h>
using namespace std;
const int big = 2000000000;
const double INF = 1e9;
const double EPS = 1e-9;
int par[1002];
int idx[1002];
int sz[1002];
int get_par(int x) {
  if (par[x] == x) {
    idx[x] = 1;
    return x;
  }
  int t = par[x];
  par[x] = get_par(par[x]);
  idx[x] = idx[t] + 1;
  return par[x];
}
int main() {
  int n, q;
  memset((idx), -1, sizeof(idx));
  scanf("%d%d", &n, &q);
  --q;
  for (int x = 0, _c = n; x < _c; ++x) {
    scanf("%d", &par[x]);
    --par[x];
    if (par[x] == -1) par[x] = x, idx[x] = 1;
  }
  set<int> blok;
  for (int x = 0, _c = n; x < _c; ++x) blok.insert(get_par(x));
  blok.erase(par[q]);
  for (int x = 0, _c = n; x < _c; ++x) sz[par[x]] = max(idx[x], sz[par[x]]);
  if (0) printf(">");
  for (int x = 0, _c = n; x < _c; ++x)
    if (0) printf(" %d", idx[x]);
  if (0) printf("\n");
  for (__typeof((blok).begin()) it = (blok).begin(); it != (blok).end(); ++it)
    if (0) printf("> %d %d\n", *it, sz[*it]);
  bool dp[1002];
  memset((dp), 0, sizeof(dp));
  dp[idx[q]] = true;
  for (__typeof((blok).begin()) it = (blok).begin(); it != (blok).end(); ++it)
    for (int x = n, _c = sz[*it]; x >= _c; --x)
      if (dp[x - sz[*it]] == true) dp[x] = true;
  for (int x = 0, _c = n + 1; x < _c; ++x)
    if (dp[x]) printf("%d\n", x);
  return 0;
}
