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, in[200005], a[200005], sta[200005], top, now, root, ans, flag;
bool vis[200005], mark[200005];
int read() {
  int x, f = 1;
  char ch;
  while (!(isdigit(ch = getchar()))) ch == '-' ? f = -1 : f;
  x = ch - 48;
  while ((isdigit(ch = getchar()))) x = x * 10 + ch - 48;
  return f * x;
}
void Topology() {
  while (now < top) {
    now++;
    int tmp = sta[now];
    vis[tmp] = 1;
    in[a[tmp]]--;
    if (!in[a[tmp]]) sta[++top] = a[tmp];
  }
}
void dfs(int u) {
  vis[u] = 1;
  if (!vis[a[u]]) dfs(a[u]);
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    a[i] = read();
    in[a[i]]++;
    if (a[i] == i) {
      flag = 1;
      root = i;
    }
  }
  for (int i = 1; i <= n; i++)
    if (!in[i]) sta[++top] = i;
  Topology();
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      if (!root) root = i;
      ans++;
      dfs(a[i]);
      a[i] = root;
      mark[i] = 1;
    }
  }
  printf("%d\n", ans - flag);
  for (int i = 1; i <= n; i++) {
    if (mark[i]) a[i] = root;
    printf("%d ", a[i]);
  }
  return 0;
}
