#include<bits/stdc++.h>
using namespace std;
//本题思路:寻找最小环
int n,t;
const int MAXN = 200010;
vector <int> p[MAXN];
bool vis[MAXN];
int ans = 3000;
void dfs(int x,int step,int start){
if(step>=1400) return ;
if(step>=ans) return;
if(vis[x]&&x==start){
ans = min(ans,step);//步数对应的即为最小环长
return;
}
vis[x]=1;
for(int i = 0;i<p[x].size();i++)
{
dfs(p[x][i],step+1,start);
}
vis[x] =0;
//为什么要回溯?当从节点 x 出发探索完一条分支后,
//需要将 x 标记为未访问,这样才能允许探索其他分支时再次经过 x。
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i = 1;i<=n;i++)
cin>>t,p[i].push_back(t);
for(int i = 1;i<=n;i++){
dfs(i,0,i);
}
cout<<ans;
return 0;
}