#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  for (int i = 0; i < (int)v.size(); ++i) {
    if (i) os << ", ";
    os << v[i];
  }
  os << "]\n";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &v) {
  os << "{";
  for (auto it : v) {
    os << it;
    if (it != *v.rbegin()) os << ", ";
  }
  os << "}\n";
  return os;
}
template <typename T, typename S>
ostream &operator<<(ostream &os, const map<T, S> &v) {
  os << "{";
  for (auto it : v) {
    os << "(" << it.first << " : " << it.second << ")";
    if (it != *v.rbegin()) os << ", ";
  }
  os << "}\n";
  return os;
}
template <typename T, typename S>
ostream &operator<<(ostream &os, const pair<T, S> &v) {
  os << "(";
  os << v.first << ", " << v.second << ")";
  return os;
}
template <typename T>
inline istream &operator>>(istream &in, vector<T> &a) {
  for (auto &x : a) in >> x;
  return in;
}
const int M1 = 1000000007;
const int M2 = 998244353;
const long long int inf = 9223372036854775807;
const int N = 200005;
vector<int> g[N];
bool vis[N];
long long int par[N];
vector<long long int> store;
bool oneTime;
void dfs(long long int u, int par) {
  vis[u] = true;
  for (auto &v : g[u]) {
    if (v == par) {
      continue;
    } else if (vis[v]) {
      if (oneTime) {
        store.push_back(v);
        oneTime = false;
      }
    } else {
      dfs(v, u);
    }
  }
}
long long int findSCC(long long int n) {
  long long int SCC = 0;
  for (int i = 1; i < n + 1; i++) {
    if (!vis[i]) {
      oneTime = true;
      SCC++;
      dfs(i, -1);
    }
  }
  return SCC;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  long long int n, m, k, a, b, temp;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> par[i];
    g[par[i]].push_back(i + 1);
    g[i + 1].push_back(par[i]);
  }
  long long int SCC = findSCC(n);
  bool exists = false;
  int root = -1;
  for (int i = 0; i < SCC; i++) {
    if (par[store[i] - 1] == store[i]) {
      exists = true;
      root = store[i];
      break;
    }
  }
  if (exists) {
    cout << SCC - 1 << "\n";
    for (int i = 0; i < SCC; i++) {
      if (store[i] != root) {
        par[store[i] - 1] = root;
      }
    }
  } else {
    cout << SCC << "\n";
    par[store[0] - 1] = store[0];
    for (int i = 1; i < SCC; i++) {
      par[store[i] - 1] = store[0];
    }
  }
  for (int i = 0; i < n; i++) {
    cout << par[i] << " ";
    if (i == n - 1) cout << "\n";
  };
}
