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 


import java.io.*;
import java.util.*;

public class CF_698_B_FIX_A_TREE {

	public static void main(String[] args) throws Exception {

		Scanner sc = new Scanner();
		int n = sc.nextInt();

		boolean[] validEdge = new boolean[n];

		UF uf = new UF(n);
		TreeSet<Integer> set = new TreeSet<>();
		int[] ans = new int[n];
		for (int x = 0; x < n; x++) {
			int y = sc.nextInt() - 1;
			ans[x] = y;
			validEdge[x] = uf.union(x, y);
		}
		for (int i = 0; i < n; i++)
			set.add(uf.findSet(i));

		int notValid = 0;
		
		if (!uf.hasRoot) {
			for (int x = 0; x < n; x++)
				if (!validEdge[x]) {
					notValid++;
					validEdge[x] = true;
					ans[x] = x;
					break;
				}
		}

		notValid += uf.sets - 1;

		System.out.println(notValid);
		int x = 0;
		StringBuilder st = new StringBuilder();
		
		for (; x < n ; x++) {
			if (!validEdge[x] && notValid > 0) {
				int i = uf.findSet(x);
				int j = set.first() == i ? set.last() : set.first();

				ans[x] = j;
				uf.union(i, j);
				if (uf.findSet(x) == i)
					set.remove(j);
				else
					set.remove(i);

				notValid--;
			}
			
			st.append(ans[x]+1).append(" ");

		}
		
		System.out.println(st);
		
		
	}

	static class UF {
		int[] rank;
		int[] p;
		int sets;
		boolean first, hasRoot;

		UF(int n) {
			sets = n;
			rank = new int[n];
			p = new int[n];

			for (int i = 0; i < n; i++)
				p[i] = i;
			hasRoot = !(first = true);

		}

		int findSet(int x) {
			return p[x] == x ? x : findSet(p[x]);
		}

		boolean isSameSet(int x, int y) {
			return findSet(x) == findSet(y);
		}

		boolean union(int x, int y) {
			int i = findSet(x);
			int j = findSet(y);

			if (i != j) {
				if (rank[i] > rank[j])
					p[j] = i;
				else {
					p[i] = j;
					if (rank[i] == rank[j])
						rank[j]++;
				}
				sets--;
				return true;
			}

			if (first)
				return hasRoot = x == y && !(first = false);

			return false;

		}

	}

	static class Scanner {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		String next() throws Exception {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		int nextInt() throws Exception {
			return Integer.parseInt(next());
		}

		long nextLong() throws Exception {
			return Long.parseLong(next());
		}

		double nextDouble() throws Exception {
			return Double.parseDouble(next());
		}
	}

}
