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

1
2 2 1  0
6 2 6 2 4 2  1 
1 1 
 2 
2 2 2 2 6 2 6 6 
 5 
2 3 4 5 11 7 8 9 10 11 11 11 14 15 11 17 18 11 
 6 
1 1 1 1 1 1 1 
 1
4 3 3 6 3 5 2  1
7 5 3 1 3 1 5  4 
1 6 4 1 1 1 1 

#include <bits/stdc++.h>
using namespace std;
int n, a, ans[200005], A[200005], root = -1, f;
bool b[200005];
vector<int> v[200005];
vector<int> cyc;
void dfs(int u, int p) {
  for (auto x : v[u]) {
    if (b[x] && x != p) {
      if (A[x] == u)
        cyc.push_back(x);
      else
        cyc.push_back(u);
    } else if (!b[x]) {
      b[x] = 1;
      dfs(x, u);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &A[i]);
    if (A[i] == i) {
      root = i;
      f = 1;
    }
    v[i].push_back(A[i]);
    v[A[i]].push_back(i);
    ans[i] = A[i];
  }
  for (int i = 1; i <= n; i++) {
    if (!b[i]) b[i] = 1, dfs(i, -1);
  }
  if (root == -1) {
    root = cyc[0];
  }
  for (int i = 0; i < (int)cyc.size(); i++) ans[cyc[i]] = root;
  int q = 0;
  for (int i = 1; i <= n; i++)
    if (A[i] != ans[i]) q++;
  printf("%d\n", q);
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
}
