#include <bits/stdc++.h>
#define maxn 55

using namespace std;

typedef long long ll;

struct Node{
	int t, i, l;
};

int n;
string s[2][maxn];
int c[maxn];
ll f[2][maxn][maxn];
bool inq[2][maxn][maxn];

queue<Node> q;

int main(){
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) cin >> s[0][i], scanf("%d", &c[i]);
	for(int i = 1;i <= n;i++) s[1][i] = s[0][i], reverse(s[1][i].begin(), s[1][i].end());
	memset(f, 0x3f, sizeof(f));
	for(int t = 0;t <= 1;t++){
		for(int i = 1;i <= n;i++){
			f[t][i][0] = c[i];
			inq[t][i][0] = true;
			q.push((Node){t, i, 0});
		}
	}
	while(!q.empty()){
		Node x = q.front();q.pop();
		inq[x.t][x.i][x.l] = false;
		if(x.l == s[x.t][x.i].length()) continue;
		for(int i = 1;i <= n;i++){
			for(int j = 0;j < s[x.t ^ 1][i].length();j++){
				if(s[x.t ^ 1][i][j] ^ s[x.t][x.i][x.l + j]) break;
				if(x.l + j == s[x.t][x.i].length() - 1){
					if(f[x.t ^ 1][i][j + 1] > f[x.t][x.i][x.l] + c[i]){
						f[x.t ^ 1][i][j + 1] = f[x.t][x.i][x.l] + c[i];
						if(!inq[x.t ^ 1][i][j + 1]){
							q.push((Node){x.t ^ 1, i, j + 1});
							inq[x.t ^ 1][i][j + 1] = true;
						}
					}
					break;
				}
				if(j + 1 == s[x.t ^ 1][i].length()){
					if(f[x.t][x.i][x.l + j + 1] > f[x.t][x.i][x.l] + c[i]){
						f[x.t][x.i][x.l + j + 1] = f[x.t][x.i][x.l] + c[i];
						if(!inq[x.t][x.i][x.l + j + 1]){
							q.push((Node){x.t, x.i, x.l + j + 1});
							inq[x.t][x.i][x.l + j + 1] = true;
						}
					}
				}
			}
		}
	}
	ll ans = 0x3f3f3f3f3f3f3f3f;
	for(int t = 0;t <= 1;t++){
		for(int i = 1;i <= n;i++){
			for(int j = 0;j < s[t][i].length();j++){
				bool tag = false;
				for(int k = 0;j + k < s[t][i].length();k++){
					if(s[t][i][j + k] != s[t][i][s[t][i].length() - 1 - k]){
						tag = true;
						break;
					}
				}
				if(!tag) ans = min(ans, f[t][i][j]);
			}
			ans = min(ans, f[t][i][s[t][i].length()]);
		}
	}
	printf("%lld", ans == 0x3f3f3f3f3f3f3f3f ? -1 : ans);
}