#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int minusinf = -inf;
const int di[] = {1, -1, 0, 0};
const int dj[] = {0, 0, 1, -1};
using namespace std;
const double INF = 1e100;
const double EPS = 1e-12;
const double PI = acos(-1.0);
int N;
int P[211111];
const int mv = 211111;
int sz;
int low[mv], num[mv];
stack<int> S;
bool visited[mv];
vector<vector<int>> SCCs;
void SCC(int u) {
  low[u] = num[u] = sz++;
  visited[u] = true;
  S.push(u);
  int v = P[u];
  if (num[v] == -1) {
    SCC(v);
  }
  if (visited[v]) low[u] = min(low[u], low[v]);
  if (low[u] == num[u]) {
    vector<int> SC;
    while (true) {
      int t = S.top();
      S.pop();
      SC.push_back(t);
      visited[t] = false;
      if (t == u) break;
    }
    SCCs.push_back(SC);
  }
}
int main() {
  scanf("%d", &N);
  int root = -1;
  int ans = 0;
  for (int(i) = (0); (i) < (N); ++(i)) {
    scanf("%d", &P[i]);
    P[i]--;
    if (P[i] == i) {
      if (root == -1)
        root = i;
      else {
        P[i] = root;
        ans++;
      }
    }
  }
  memset((num), (-1), sizeof(num));
  memset((visited), (false), sizeof(visited));
  for (int(i) = (0); (i) < (N); ++(i)) {
    if (num[i] == -1) SCC(i);
  }
  if (root == -1) {
    for (int(i) = (0); (i) < (SCCs.size()); ++(i)) {
      if (SCCs[i].size() > 1) {
        if (root == -1) {
          root = SCCs[0][0];
          P[root] = root;
          ans++;
        } else {
          int u = SCCs[i][0];
          P[u] = root;
          ans++;
        }
      }
    }
  } else {
    for (int(i) = (0); (i) < (SCCs.size()); ++(i)) {
      if (SCCs[i].size() > 1) {
        int u = SCCs[i][0];
        P[u] = root;
        ans++;
      }
    }
  }
  printf("%d\n", ans);
  for (int(i) = (0); (i) < (N); ++(i)) {
    if (i) printf(" ");
    printf("%d", P[i] + 1);
  }
  puts("");
  return 0;
}
