Problem:
Score : 600 points

Problem Statement

We have N strings of lowercase English letters: S_1, S_2, \cdots, S_N.

Takahashi wants to make a string that is a palindrome by choosing one or more of these strings - the same string can be chosen more than once - and concatenating them in some order of his choice.

The cost of using the string S_i once is C_i, and the cost of using it multiple times is C_i multiplied by that number of times.

Find the minimum total cost needed to choose strings so that Takahashi can make a palindrome.

If there is no choice of strings in which he can make a palindrome, print -1.

Constraints

1 \leq N \leq 50

1 \leq |S_i| \leq 20

S_i consists of lowercase English letters.

1 \leq C_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
S_1 C_1
S_2 C_2
:
S_N C_N

Output

Print the minimum total cost needed to choose strings so that Takahashi can make a palindrome, or -1 if there is no such choice.

Sample Input 1

3
ba 3
abc 4
cbaa 5

Sample Output 1

7

We have ba, abc, and cbaa.

For example, we can use ba once and abc once for a cost of 7, then concatenate them in the order abc, ba to make a palindrome.
Also, we can use abc once and cbaa once for a cost of 9, then concatenate them in the order cbaa, abc to make a palindrome.

We cannot make a palindrome for a cost less than 7, so we should print 7.

Sample Input 2

2
abcab 5
cba 3

Sample Output 2

11

We can choose abcab once and cba twice, then concatenate them in the order abcab, cba, cba to make a palindrome for a cost of 11.

Sample Input 3

4
ab 5
cba 3
a 12
ab 10

Sample Output 3

8

We can choose a once, which is already a palindrome, but it is cheaper to concatenate ab and cba.

Sample Input 4

2
abc 1
ab 2

Sample Output 4

-1

We cannot make a palindrome, so we should print -1.

Solution in PyPy3 (7.3.0) (judge verdict: Wrong Answer)

import sys;input=sys.stdin.readline

def dfs(v):
    CC = 10**18
    ff = 0
    if v in gs:
        return 1, 0
    for u, c in G[v]:
        if u in vs:
            continue
        vs.add(u)
        if u in gs:
            return 1, c
        f, c2 = dfs(u)
        if f:
            ff = 1
            CC = min(CC, c2+c)
    return ff, CC

def han(s):
    n = len(s)
    for i in range(n):
        if s[i] != s[n-i-1]:
            return 0
    return 1


N, = map(int, input().split())
R = []
L = []
for _ in range(N):
    s, c = input().split()
    t = s[::-1]
    c = int(c)
    for i in range(len(s)+1):
        R.append((s[i:], s[:i], c))
        L.append((t[i:], t[:i], c))
#print(R)
#print(L)
M = len(R)
G = [set() for _ in range(M*2)]
gs = set()
starts = list()
for i in range(M):
    r = R[i]
    if r[1] == "":
        starts.append(i)
    if han(r[0]):
        gs.add(i)
        gs.add(i+M)
    for j in range(M):
        l = L[j]
        if r[1] == l[0]:
            G[j+M].add((i, r[2]))
        if r[0] == l[1]:
            G[i].add((M+j, l[2]))

vs = set()
#print(dfs(12))
#print("st")
#print(gs)
RR = 10**18
for s in starts:
    vs.add(s)
    cc = R[s][2]
    f, A = dfs(s)
#    print("c",s)
    if f:
        RR = min(A+cc, RR)
#        print("R",A+cc)
#    print("c",s+M)
    f, A = dfs(s+M)
    if f:
        RR = min(A+cc, RR)
#        print(cc)
#        print("R",A+cc)
if RR == 10**18:
    print(-1)
else:
    print(RR)