#include<bits/stdc++.h>
using namespace std;
const int MAXN=155;
const int N=3636363;
const int INF=1e9;
int F[MAXN][MAXN][MAXN],P[MAXN],dp[N],tc[N],len[N],pw[MAXN],cnt[MAXN],w[MAXN],trace[MAXN][MAXN][MAXN],op[MAXN][MAXN],ans[MAXN];
pair<int,int> A[MAXN],opt[MAXN][MAXN][MAXN];
vector< vector<int> > chain[MAXN];
vector<int> vi;
bool ck[MAXN],vis[N];
void dfs(int i)
{
ck[i]=true,vi.push_back(i);
if(!ck[P[i]]) dfs(P[i]);
}
int solve(int v,int cc)
{
if(v==0) return 0;
if(vis[v]) return dp[v];
int res=v;
dp[v]=INF,vis[v]=true;
for(int i=cc-1;i+1;i--)
{
if(res>=pw[i])
{
while(res>=pw[i]) res-=pw[i];
len[v-pw[i]]=len[v]+w[i];
int z=max(op[len[v]+1][len[v]+w[i]],solve(v-pw[i],cc));
if(dp[v]>z) dp[v]=z,tc[v]=i;
}
}
return dp[v];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>P[i];
for(int i=1;i<=n;i++)
{
cin>>A[i].first;
A[i].second=i;
}
sort(A+1,A+n+1);
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++) for(int k=i;k<=n;k++)
{
if(j==i&&k==i) F[i][j][k]=0;
else if(k==i) F[i][j][k]=max(F[i][j-1][k],A[j].first-A[j-1].first),trace[i][j][k]=j-1;
else if(j==i) F[i][j][k]=max(F[i][j][k-1],A[k].first-A[k-1].first),trace[i][j][k]=k-1;
else if(j>k)
{
if(j==k+1)
{
F[i][j][k]=INF;
for(int l=k-1;l>=i;l--) if(F[i][j][k]>max(F[i][l][k],A[j].first-A[l].first))
F[i][j][k]=max(F[i][l][k],A[j].first-A[l].first),trace[i][j][k]=l;
}
else F[i][j][k]=max(F[i][j-1][k],A[j].first-A[j-1].first),trace[i][j][k]=j-1;
}
else if(j<k)
{
if(k==j+1)
{
F[i][j][k]=INF;
for(int l=j-1;l>=i;l--) if(F[i][j][k]>max(F[i][j][l],A[k].first-A[l].first))
F[i][j][k]=max(F[i][j][l],A[k].first-A[l].first),trace[i][j][k]=l;
}
else F[i][j][k]=max(F[i][j][k-1],A[k].first-A[k-1].first),trace[i][j][k]=k-1;
}
}
for(int j=i;j<=n;j++) if(j==i) op[i][j]=0,opt[i][j][1]=A[i];
else
{
int mn=INF,pos=0;
for(int k=j-1;k>=i;k--) if(mn>max(F[i][j][k],A[j].first-A[k].first))
mn=max(F[i][j][k],A[j].first-A[k].first),pos=k;
int l=1,r=j-i+1,u=j,v=pos;
while(u!=i||v!=i)
{
int p=trace[i][u][v];
if(u>v) opt[i][j][l++]=A[u],u=p;
else opt[i][j][r--]=A[v],v=p;
}
opt[i][j][l]=A[i],op[i][j]=mn;
}
}
for(int i=1;i<=n;i++) if(!ck[i])
{
dfs(i);
chain[vi.size()].push_back(vi),vi.clear();
}
int cc=0;
pw[0]=1;
for(int i=1;i<=n;i++) if(!chain[i].empty()) w[cc++]=i,pw[cc]=pw[cc-1]*(chain[i].size()+1);
cout<<solve(pw[cc]-1,cc)<<"\n";
int pos=pw[cc]-1,l=0;
while(pos)
{
int a=tc[pos],k=w[a];
vi=chain[k].back(),chain[k].pop_back();
for(int i=0;i<vi.size();i++) ans[vi[i]]=opt[l+1][l+k][i+1].first;
pos-=pw[a],l+=k;
}
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
}