#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std;
typedef long long ll;
const int maxn=5000010;
int tot,head[maxn],nex[maxn],to[maxn],w[maxn];
void add(int u,int v,int _w)
{
    to[++tot]=v;nex[tot]=head[u];
    head[u]=tot;w[tot]=_w;
}
int n,id,st,c[55],len[55],et,l[55][25],r[55][25];
ll dis[maxn];
bool vis[maxn];
struct node
{
    int x;
    ll v;
    node(int x=0,ll v=0):x(x),v(v){}
    bool operator<(const node&o)const
    {
        return v>o.v;
    }
};
char s[55][25];
priority_queue<node>q;
bool judge(int l,int r,int k)
{
    while(l<r)
    {
        if(s[k][l]!=s[k][r]) return false;
        l++;r--;
    }
    return true;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%s%d",s[i]+1,&c[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;s[i][j];j++)
        l[i][j]=++id,r[i][j]=++id;
    st=++id;et=++id;
    for(int i=1;i<=n;i++)
        len[i]=strlen(s[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=len[i];j++)
    {
        if(judge(j,len[i],i)) add(l[i][j],et,0);
        for(int k=1;k<=n;k++)
        {
            if(len[k]<len[i]-j+1)
            {
                bool flag=true;
                int a=j,b=len[k];
                for(;b>=1;a++,b--)
                    if(s[i][a]!=s[k][b]) flag=false;
                if(!flag) continue;
                add(l[i][j],l[i][a],c[k]);
                continue;
            }
            bool flag=true;
            int a=j,b=len[k];
            for(;a<=len[i];a++,b--)
                if(s[i][a]!=s[k][b])
            {
                flag=false;break;
            }
            if(!flag) continue;
            if(judge(1,b,k)) add(l[i][j],et,c[k]);
            else add(l[i][j],r[k][b],c[k]);
        }
        add(st,l[i][1],c[i]);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=len[i];j++)
        {
            if(judge(1,j,i)) add(r[i][j],et,0);
            for(int k=1;k<=n;k++)
            {
                if(len[k]<j)
                {
                    bool flag=true;
                    int a=j,b=1;
                    for(;b<=len[k];b++,a--)
                        if(s[i][a]!=s[k][b]) flag=false;
                    if(!flag) continue;
                    add(r[i][j],r[i][a],c[k]);
                    continue;
                }
                bool flag=true;
                int a=j,b=1;
                for(;a;a--,b++)
                    if(s[i][a]!=s[k][b])
                {
                    flag=false;break;
                }
                if(!flag) continue;
                if(judge(b,len[k],k)) add(r[i][j],et,c[k]);
                else add(r[i][j],l[k][b],c[k]);
            }
            add(st,r[i][len[i]],c[i]);
        }
    memset(dis,inf,sizeof(dis));
    dis[st]=0;
    q.push(node(st,dis[st]));
    while(!q.empty())
    {
        int u=q.top().x;q.pop();
        if(vis[u]) continue;
        vis[u]=true;
        for(int i=head[u];i;i=nex[i])
        {
            int v=to[i];
            if(dis[v]>dis[u]+w[i])
            {
                dis[v]=dis[u]+w[i];
                q.push(node(v,dis[v]));
            }
        }
    }
    if(dis[et]==inf) printf("-1\n");
    else printf("%lld\n",dis[et]);
}



Measured memory_bytes: 42884