#include <bits/stdc++.h>
using namespace std;
const int N = 200500;
int in[N];
int n;
vector<vector<int> > adj;
int low[N], num[N], parent[N];
inline void dfs(const int u, int &dfs_time, pair<int, int> &nom_bridge,
                int &self_loop) {
  num[u] = low[u] = dfs_time++;
  for (int v : adj[u]) {
    if (num[v] == -1) {
      parent[v] = u;
      dfs(v, dfs_time, nom_bridge, self_loop);
      low[u] = min(low[u], low[v]);
      if (low[v] <= num[u] and nom_bridge == pair<int, int>(-1, -1)) {
        nom_bridge = pair<int, int>(u, v);
      }
    } else if (v != parent[u] or
               (v == parent[u] and in[v] == u and in[u] == v)) {
      low[u] = min(low[u], low[v]);
      if (low[v] <= num[u] and nom_bridge == pair<int, int>(-1, -1)) {
        nom_bridge = pair<int, int>(u, v);
      }
    }
  }
  if (u == in[u]) {
    self_loop = u;
  }
}
inline pair<int, int> find_bridge(const int u, int &self_loop) {
  int dfs_time = 0;
  pair<int, int> nom_bridge(-1, -1);
  dfs(u, dfs_time, nom_bridge, self_loop);
  return nom_bridge;
}
int main() {
  scanf("%d", &n);
  adj.resize(n + 1);
  for (int u = 1; u <= n; ++u) {
    int v;
    scanf("%d", &v);
    in[u] = v;
    if (u != v) {
      adj[u].push_back(v);
      adj[v].push_back(u);
    }
  }
  memset(num, -1, sizeof num);
  vector<int> cycles, no_cycles;
  for (int u = 1; u <= n; ++u) {
    if (num[u] != -1) continue;
    int self_loop = -1;
    pair<int, int> bridge = find_bridge(u, self_loop);
    if (bridge != pair<int, int>(-1, -1)) {
      int v = bridge.second;
      cycles.push_back(v);
    } else {
      no_cycles.push_back(self_loop);
    }
  }
  int ans = 0;
  if (!no_cycles.empty()) {
    for (int u : cycles) {
      in[u] = no_cycles[0];
      ++ans;
    }
  } else {
    ++ans;
    int u = cycles[0];
    in[u] = u;
    for (int i = 1; i < (int)cycles.size(); ++i) {
      int v = cycles[i];
      in[v] = u;
      ++ans;
    }
  }
  for (int i = 0; i < (int)no_cycles.size() - 1; ++i) {
    int u = no_cycles[i];
    int v = no_cycles[i + 1];
    in[u] = v;
    ++ans;
  }
  printf("%d\n", ans);
  for (int u = 1; u <= n; ++u) {
    printf("%d ", in[u]);
  }
  puts("");
  return 0;
}
