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.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

public class _Fix_A_Tree {

	public static void main(String[] args) {
		Scanner scn = new Scanner(System.in);
		int n = scn.nextInt();
		int[] arr = new int[n + 1];
		int[] b = new int[n + 1];
		int root = 0;
		for (int i = 1; i <= n; i++) {
			arr[i] = scn.nextInt();
			if (i == arr[i]) {
				root = arr[i];
			}
		}
		b[root] = 1;
		int cur = 1;
		int ind;
		int count = 0;
		for (int i = 1; i <= n; i++) {
			if (b[i] == 0) {
				ind = i;
				cur++;

				while (b[ind] == 0) {
					b[ind] = cur;
					ind = arr[ind];
				}
				if (b[ind] == cur) {
					count++;
					if (root == 0) {
						root = ind;
						arr[root] = root;
					} else {
						arr[ind] = root;
					}
				}
			}
		}
		System.out.println(count);
		for (int i = 1; i <=n; i++) {
System.out.print(arr[i]+" ");
		}
	}

	static boolean b = false;

	public static void dfs(int v, int[] arr, HashSet<Integer> visit, ArrayList<Integer> backedge) {

		if (v == arr[v]) {
			b = true;
			return;
		}
		if (visit.contains(arr[v])) {
			backedge.add(1);
			return;
		}
		visit.add(v);
		dfs(arr[v], arr, visit, backedge);
	}
}
