#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=200005,maxe=200005;
int n,tot,son[maxe],nxt[maxe],lnk[maxn],ans=1<<30;
bitset <maxn> vis,v;
unordered_map <int,int> pre;
struct ZYX{int x,s;}que[maxn];
int read(){
int ret=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){ret=ret*10+c-'0';c=getchar();}
return ret*f;
}
void add_e(int x,int y){son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot;}
void work(int x){
int now=x;
while(!v[now])v[now]=1,now=pre[now];
}
void BFS(int pos){
int hed=0,til=1;vis=0;pre.clear();
que[1]=(ZYX){pos,0};
while(hed!=til){
hed=(hed+1)%maxn;
for(int j=lnk[que[hed].x];j;j=nxt[j]){
if(vis[son[j]])continue;vis[son[j]]=1;pre[son[j]]=que[hed].x;
til=(til+1)%maxn;que[til]=(ZYX){son[j],que[hed].s+1};
if(que[til].x==pos){work(pos);ans=min(ans,que[til].s);return;}
}
}
work(pos);
}
signed main(){
n=read();
for(int i=1;i<=n;i++)add_e(i,read());
for(int i=1;i<=n;i++){
if(!v[i])BFS(i);
}
printf("%lld\n",ans);
return 0;
}