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 fixatree {
	public static void main(String[] aes)
	{
		InputReader in=new InputReader(System.in);
		PrintWriter pw=new PrintWriter(System.out);
		int n=in.nextInt();
		int[] parent=new int[n];
		int globalparent=-1;
		for(int i=0;i<n;i++)
		{
			parent[i]=in.nextInt()-1;
			if(parent[i]==i && globalparent==-1)
			{
				globalparent=i;
			}
		}
		disjointset ds=new disjointset(n);
		int count=0;
		for(int i=0;i<n;i++)
		{
			if(i!=parent[i])
			{
			if(ds.findset(i)==ds.findset(parent[i]))
			{
				count++;
				//System.out.println("for i"+i);
				if(globalparent!=-1)
				{
				parent[i]=globalparent;
				}
				else
				{
					parent[i]=i;
					globalparent=i;
				}
			}
			else
			{
				ds.mergeset(i, parent[i]);
			}
			}
		}
		int count2=0;
		int last=-1;
		for(int i=0;i<n;i++)
		{
			if(parent[i]==i)
			{
				count2++;
				last=i;
			}
		}
		int count3=count2;
		
		for(int i=0;i<n;i++ )
		{
			if(parent[i]==i && count2>1)
			{
				count2--;
				parent[i]=last;
			}
		}
		//System.out.println(count+" "+count3);
		int ans=count+count3-1;
		pw.println(ans);
		for(int i=0;i<n;i++)
		{
			pw.print((parent[i]+1)+" ");
		}
		pw.close();
		
	}
	static class InputReader {
		 
		private InputStream stream;
		private byte[] buf = new byte[8192];
		private int curChar;
		private int snumChars;
		private SpaceCharFilter filter;

		public InputReader(InputStream stream) {
			this.stream = stream;
		}

		public int snext() {
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars) {
				curChar = 0;
				try {
					snumChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		public int nextInt() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}

			int res = 0;

			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));

			return res * sgn;
		}

		public long nextLong() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}

			long res = 0;

			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));

			return res * sgn;
		}

		public String readString() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = snext();
			} while (!isSpaceChar(c));
			return res.toString();
		}

		public boolean isSpaceChar(int c) {
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		public interface SpaceCharFilter {
			public boolean isSpaceChar(int ch);
		}
	}

static  class disjointset {
	static int[] parent;
	static int[] rank;
	public disjointset(int n)
	{
		parent=new int[n];
		rank=new int[n];
		this.createSet(n);
	}
	public static void createSet(int n)
	{
		for(int i=0;i<n;i++)
		{
			parent[i]=i;
		}
		return;
	}
	public static int findset(int x)
	{
		if(x!=parent[x])
		{
			parent[x]=findset(parent[x]);
		}
		return parent[x];
	}
	public static void mergeset(int x,int y)
	{
		int px=findset(x);
		int py=findset(y);
		if(rank[px]>rank[py])
		{
			parent[py]=px;
		}
		else
		{
			parent[px]=py;
		}
		if(rank[px]==rank[py])
		{
			rank[py]++;
		}
	}

}


}
