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;
struct Node {
  bool byl;
  bool ref;
  int prev;
};
Node nodes[1100];
vector<int> delky;
bool cansize[3300];
int main() {
  int N, X;
  scanf("%d%d", &N, &X);
  --X;
  int ixoff;
  for (int i = 0; i < N; ++i) {
    scanf("%d", &nodes[i].prev);
    nodes[i].prev--;
    nodes[nodes[i].prev].ref = true;
  }
  for (int i = 0; i < N; ++i) {
    if (!nodes[i].ref) {
      int curr = i;
      int len = 1;
      bool isix = false;
      if (curr == X) {
        isix = true;
        ixoff = 0;
      }
      while (nodes[curr].prev != -1) {
        curr = nodes[curr].prev;
        len++;
        if (isix) ixoff++;
        if (curr == X) {
          isix = true;
          ixoff = 0;
        }
      }
      if (!isix) {
        delky.push_back(len);
      }
    }
  }
  cansize[0] = 1;
  for (int i = 0; i < delky.size(); ++i) {
    for (int j = N + 1 - delky[i]; j >= 0; --j) {
      if (cansize[j]) {
        cansize[j + delky[i]] = true;
      }
    }
  }
  for (int i = 0; i < N; ++i) {
    if (cansize[i]) {
      printf("%d\n", i + ixoff + 1);
    }
  }
  return 0;
}
