// https://szkopul.edu.pl/problemset/problem/e0qogVe4A5ivK_pTdUXL39FV/site/?key=statement
#include <iostream>
#include <limits.h>
#include <queue>
#include <vector>
const int sizik = 1000 * 1000 + 8;
bool arr[sizik];
// bool odw[sizik];
int deg[sizik];
int nast[sizik];
void DFS(int v, long long& temp) {
if (arr[v]) {
return;
}
temp += v;
arr[v] = true;
DFS(nast[v], temp);
}
int main() {
std::ios_base::sync_with_stdio(0);
int n;
std::cin >> n;
for (int i = 1; i <= n; i++) {
int a;
std::cin >> a;
nast[i] = a;
deg[nast[i]]++;
}
std::queue<int> du;
for (int i = 1; i <= n; i++) {
if (deg[i] == 0) {
du.push(i);
}
}
while (!du.empty()) {
int v = du.front();
du.pop();
arr[v] = true;
int u = nast[v];
deg[u]--;
if (deg[u] == 0) {
du.push(u);
}
}
long long wynik = LLONG_MAX;
for (int i = 1; i <= n; i++) {
if (!arr[i]) {
long long temp = 0;
DFS(i, temp);
wynik = std::min(wynik, temp);
}
}
std::cout << wynik << '\n';
return 0;
}