#include<bits/stdc++.h>
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define ri(x) scanf("%d",&(x))
#define ri2(x,y) scanf("%d %d",&(x),&(y))
#define ri3(x,y,z) scanf("%d %d %d",&(x),&(y),&(z))
#define rll(x) scanf("%lld",&(x))
#define rll2(x,y) scanf("%lld %lld",&(x),&(y))
#define rll3(x,y,z) scanf("%lld %lld %lld",&(x),&(y),&(z))
#define gc(x) ((x) = getchar())
using namespace::std;

const long double PI = acos(-1);
const long long MOD = 1000000000 +7;

typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<ll,pll> tll;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<pll> vpll;
typedef vector<tll> vtll;
typedef vector<string> vs;
typedef set<int> si;
typedef set<ii> sii;
typedef set<iii> siii;

ll gcd(ll a, ll b){ return b==0?a:gcd(b,a%b);}

ll add(ll a, ll b, ll m = MOD){
	if(a >= m) a %= m;
	if(b >= m) b %= m;
	if(a < 0) a += m;
	if(b < 0) b += m;
	ll res = a+b;
	if(res >= m or res <= -m) res %= m;
	if(res < 0) res += m;
	return res;
}

ll mul(ll a, ll b, ll m = MOD){
	if(a >= m) a %= m;
	if(b >= m) b %= m;
	if(a < 0) a += m;
	if(b < 0) b += m;
	ll res = a*b;
	if(res >= m or res <= -m) res %= m;
	if(res < 0) res += m;
	return res;
}

ll pow_mod(ll a, ll b, ll m = MOD){
	ll res = 1LL;
	a = a%m;
	while(b){
		if(b&1) res = mul(res,a,m);
		b >>= 1;
		a = mul(a,a,m);
	}
	return res;
}

ll fastexp(ll a, ll b){
	ll res = 1LL;
	while(b){
		if(b&1) res = res*a;
		b >>= 1;
		a *= a;
	}
	return res;
}

int gcdExtendido(int a, int b, int *x, int *y){
	if(a == 0){
		*x = 0;
		*y = 1;
		return b;
	}
	int x1, y1;
	int gcd = gcdExtendido(b%a,a,&x1,&y1);
	
	*x = y1-(b/a)*x1;
	*y = x1;
	return gcd;
}

int modInverso(int a, int m){
	int x, y;
	int g = gcdExtendido(a,m,&x,&y);
	if(g!=1) return -1;
	else return (x%m + m)%m;
}

/****************************************
*************P*L*A*N*T*I*L*L*A************
*****************************************/

const int SUML = 1000 + 5;
const int N = 50 + 5;
const int L = 20 + 5;
const int E = 30;
const ll inf = 1e18;

int n;
int c[N];
int len[N];
char s[N][L];
map<string, ll> D;

void parse(string &val, string &l, string &r){
	l = "";
	r = "";
	bool first = true;
	for(int i = 0; i < val.size(); i++){
		if(val[i] == '#'){
			first = false;
			continue;
		}
		if(first) l += val[i];
		else r += val[i];
	}
}

void split(int i, int le, string &l, string &r){
	l = "";
	r = "";
	for(int j = le - 1; j >= 0; j--){
		l += s[i][j];
	}
	for(int j = le; j < len[i]; j++){
		r += s[i][j];
	}
}

bool check(string &l, string &r){
	if(l.size() > r.size()){
		if(l.substr(0, r.size()) != r) return false;
		l = l.substr(r.size());
		r = "";
	}
	else{
		if(r.substr(0, l.size()) != l) return false;
		r = r.substr(l.size());
		l = "";
	}
	return true;
}

ll solve(){
	priority_queue< pair<ll, string> > Q;
	for(int i = 1; i <= n; i++){
		for(int j = 0; j <= len[i]; j++){
			string l, r;
			split(i, j, l, r);
			string l1 = l, r1 = r;
			if(check(l1, r1)){
				string cur = l1 + "#" + r1;
				if(!D.count(cur) or D[cur] > c[i]){
					D[cur] = c[i];
					Q.emplace(mp(-c[i], cur));
				}
			}
			if(l.size()){
				l1 = l.substr(1);
				r1 = r;
				if(check(l1, r1)){
					string cur = l1 + "#" + r1;
					if(!D.count(cur) or D[cur] > c[i]){
						D[cur] = c[i];
						Q.emplace(mp(-c[i], cur));
					}
				}
			}
			if(r.size()){
				l1 = l;
				r1 = r.substr(1);
				if(check(l1, r1)){
					string cur = l1 + "#" + r1;
					if(!D.count(cur) or D[cur] > c[i]){
						D[cur] = c[i];
						Q.emplace(mp(-c[i], cur));
					}
				}
			}
		}
	}
	while(!Q.empty()){
		ll dis = -Q.top().first;
		string cur = Q.top().second;
		Q.pop();
		if(D[cur] < dis) continue;
		string l, r;
		parse(cur, l, r);
		for(int i = 1; i <= n; i++){
			string new_l = l;
			string new_r = r;
			if(l.size()){
				for(int j = 0; j < len[i]; j++){
					new_r += s[i][j];
				}
			}
			else{
				for(int j = len[i] - 1; j >= 0; j--){
					new_l += s[i][j];
				}
			}
			if(check(new_l, new_r)){
				string nxt = new_l + "#" + new_r;
				if(!D.count(nxt) or D[nxt] > dis + c[i]){
					D[nxt] = dis + c[i];
					Q.emplace(mp(-D[nxt], nxt));
				}
			}
		}
	}
	return D.count("#")? D["#"] : -1;
}

int main(){
	ri(n);
	for(int i = 1; i <= n; i++){
		scanf("%s %d", s[i], &c[i]);
		len[i] = strlen(s[i]);
	}
	printf("%lld\n", solve());
	return 0;
}


Measured memory_bytes: 3972