#include<bits/stdc++.h>
#define ll long long
#define pii_ pair<int,int>
#define mp_ make_pair
#define pb push_back
#define fi first
#define se second
#define TIMES 10
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define show1(a) cout<<#a<<" = "<<a<<endl
#define show2(a,b) cout<<#a<<" = "<<a<<"; "<<#b<<" = "<<b<<endl
using namespace std;
const ll INF = 1LL<<60;
const int inf = 1<<30;
const int maxn = 1e5+5;
inline void fastio() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
int n,p[maxn],has[maxn],ans,belong[maxn];
vector<int> g[maxn],no[maxn];
void dfs(int u,int f,int rt)
{
belong[u] = rt;
for(int v:g[u]){
dfs(v,u,rt);
}
if(!has[u] && (f!=0&&!has[f])) has[u]=has[f]=1,ans++;
if(!has[u]) no[rt].pb(u);
}
struct node
{
int id;
bool operator < (node e) const
{
return no[id].size()>no[e.id].size();
}
};
#define LOCAL
int main()
{
fastio();
#ifdef LOCAL
freopen("hidden.in","r",stdin);
freopen("hidden.out","w",stdout);
#endif
cin>>n;
vector<int> root;
rep(i,2,n){
cin>>p[i];
if(!p[i]) root.pb(i);
else g[p[i]].pb(i);
}
vector<int> tot,rest;
dfs(1,0,1); for(int x:no[1]) tot.pb(x);
int cnt = 0;
for(int x:root){
dfs(x,0,x);
if(has[x]){
for(int y:no[x]) tot.pb(y);
p[x] = 1;
}else rest.pb(x);
}
auto cmp = [&] (int x,int y) {return no[x].size()>no[y].size();};
sort(rest.begin(),rest.end(),cmp);
for(int x:rest){
if(tot.size()){
p[x] = tot.back(); tot.pop_back(); ans++;
}else{
p[x] = 1; tot.pb(x);
}
for(int y:no[x]){
if(y!=x) tot.pb(y);
}
}
cout<<ans<<endl;
rep(i,2,n) cout<<p[i]<<" \n"[i==n];
return 0;
}
/*
7
0 0 0 0 0 0
*/