	//	????°???????????????????
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEF_ELEM_MAX 1000
#define DEF_VMAX 10000

//  ????°?????????????
#ifndef min
#define min(a, b)            (((a) < (b)) ? (a) : (b))
#endif

typedef struct _node {
	int value;
	int place;
} node;

int A[DEF_ELEM_MAX];

/////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////
int int_sort( const void * a , const void * b )
{
	int p = (( node * )a)->value;
	int q = (( node * )b)->value;
  if( p < q ) {
    return -1;
  }  else if( p == q  ) {
    return 0;
  }
  return 1;
}

/////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////
int sillysort( int *A, int m )
{
	int s;
	int cost = 0;
	int i;
	int j;
	int n;
	int amin;
	int sum;
	int next;

	node nodes[1000] = {0};
	node temp[1000] = {0};
	// init
	for ( i = 0 ; i < m ; i++ ) {
		nodes[i].value = A[i];
		temp[i].value = A[i];
		temp[i].place = i;
	}

	qsort(&temp, m , sizeof( node ), int_sort );

	for ( i = 0 ; i < m ; i++ ) {
		nodes[temp[i].place].place = i;
	}
	s = temp[0].value;
	// compute
	for ( i = 0 ; i < m ; i++ ) {
		j = nodes[i].place;
		if ( j >= 0 && j != i ) {
			n = 1;
			amin = sum = nodes[i].value;
			while ( j != i ) {
				next = nodes[j].place;
				if ( nodes[j].value < amin ) {
					amin = nodes[j].value;
				}
				sum += nodes[j].value;
				n++;
				nodes[j].place = -1;
				j = next;
			}
			cost += min(sum+(n-2)*amin, sum+amin+(n-1)*s);
		}
	}
	return cost;
}
/////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////
int main(void)
{
	int i;
	int N;
	int ans;
//
	scanf("%d", &N);
	for ( i = 0 ; i < N ; i++ ) {
		scanf("%d", &A[i] );
	}

	ans = sillysort( A, N );

	printf("%d\n", ans);

	return 0;
}