#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<unordered_map>
#include<cstdlib>
using namespace std;
typedef long long LL;
const int N=2010,MOD=998244353,INF=0x7f7f7f7f;
// unordered_map<int,int>mp;
map<int,int>mp;

struct NODE{
    int x,idx;
    bool operator<(const NODE& o) const{
        return x<o.x;
    }
}a[N];
int n;
int fa[N],val[N],tot[N];
int find(int u){
    return fa[u]==u?u:fa[u]=find(fa[u]);
}

void solve(){
    cin>>n;
    int minn=1;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        a[i]={x,i};
        fa[i]=i;
        val[i]=x;
        tot[i]=1;
        if(a[i].x<a[minn].x) minn=i;
    }
    minn=a[minn].x;
    sort(a+1,a+1+n);
    
    // for(int i=1;i<=n;i++){
    //     cout<<a[i].x<<' '<<a[i].idx<<endl;
    // }
    
    LL res=0;
    for(int i=1;i<=n;i++){
        if(a[i].idx==i) continue;
        int u=a[i].idx;
        int v=a[u].idx;
        int fu=find(u),fv=find(v);
        if(fu!=fv){
            val[fv]=min(val[fv],val[fu]);
            tot[fv]=tot[fu]+tot[fv];
            fa[fu]=fv;
        }
        res+=a[i].x;
    }
    
    // for(int i=1;i<=n;i++){
    //     cout<<fa[i]<<' '<<val[i]<<' '<<tot[i]<<endl;
    // }
    
    
    for(int i=1;i<=n;i++){
        if(fa[i]==i&&tot[i]>=2){
            // cout<<i<<' '<<tot[i]<<endl;
            //两种情况 1.并查集内部换n-1次  2.先和整个序列里最小的x换,再用x换n-1次,再换回来
            res+=min( val[i]*(tot[i]-2),minn*(tot[i]+1)+val[i]);

        }
    }
    cout<<res<<endl;
    
    
}

int main(){
    ios::sync_with_stdio(false),cin.tie(0);

    int t;
    // cin>>t;
    t=1;
    while(t--) solve();
    
    return 0;
}