#include <bits/stdc++.h>
using namespace std;
vector<int> g[200002];
vector<int> ig[200002];
bool visited[200002];
vector<int> roots;
int ans[200002];
int parent[200002];
int size[200002];
bool done[200002];
void initialise(int n) {
  memset(done, false, sizeof(done));
  memset(visited, false, sizeof(visited));
  for (int i = 1; i <= n; i++) {
    size[i] = 1;
    parent[i] = i;
  }
}
int root(int x) {
  while (parent[x] != x) {
    parent[x] = parent[parent[x]];
    x = parent[x];
  }
  return x;
}
void unite(int a, int b) {
  int r_a = root(a);
  int r_b = root(b);
  if (size[r_a] < size[r_b]) {
    size[r_b] += size[r_a];
    parent[r_a] = parent[r_b];
  } else {
    size[r_a] += size[r_b];
    parent[r_b] = parent[r_a];
  }
}
void mark(int x) {
  if (visited[x]) return;
  visited[x] = true;
  for (int i = 0; i < g[x].size(); i++) mark(g[x][i]);
}
int mark_inv(int x) {
  if (visited[x]) {
    return x;
  }
  visited[x] = true;
  int ans = -1;
  for (int i = 0; i < ig[x].size(); ++i) {
    int t = mark_inv(ig[x][i]);
    if (t != -1) ans = t;
  }
  return ans;
}
int main() {
  int n;
  cin >> n;
  initialise(n);
  int count = 0;
  for (int i = 1; i <= n; i++) {
    cin >> ans[i];
    if (i == ans[i])
      roots.push_back(i);
    else {
      unite(i, ans[i]);
      g[ans[i]].push_back(i);
      ig[i].push_back(ans[i]);
    }
  }
  int root_tree = -1;
  if (roots.size() > 0) {
    root_tree = roots[0];
    for (int i = 0; i < roots.size(); i++) {
      mark(roots[i]);
      done[root(roots[i])] = true;
      ans[roots[i]] = root_tree;
      count++;
    }
    count--;
  }
  for (int i = 1; i <= n; i++) {
    if (!visited[i] && !done[root(i)]) {
      count++;
      if (root_tree == -1) {
        root_tree = mark_inv(i);
        ans[root_tree] = root_tree;
        done[root(i)] = true;
      } else {
        ans[mark_inv(i)] = root_tree;
        done[root(i)] = true;
      }
    }
  }
  cout << count << endl;
  for (int i = 1; i <= n; i++) cout << ans[i] << " ";
  cout << endl;
}
