/*

RFL <3
The Feeling of Happiness

"In dreams begin responsibility"

*/


#include<bits/stdc++.h>

using namespace std;

#define sf scanf
#define pf printf
#define ll long long
#define fr(I,M,N) for(I=M;I<=N;I++)
#define fr_(I,M,N) for(I=M;I>=N;I--)
#define re return
#define sfn cin>>n
#define bal pf("bal\n")
#define pb push_back
#define ins insert
#define sz(X) X.size()
#define xx first
#define yy second
#define skip continue
#define memo(X,N) memset(X,N,sizeof(X))
#define all(X) X.begin(),X.end()
#define mp make_pair
#define pi acos(-1)


/*
#define nMX 5000000
#define pMX 500000
int pr[pMX+1],prnum[nMX+1];

int sieve()
{
    int i,j;
    for(i=1;i<=nMX;i++)
        prnum[i]=i+1;
    for(i=1;i<=nMX;i++)
        if(prnum[i]!=-1)
            for(j=2*prnum[i]-1;j<=nMX;j+=prnum[i])
                    prnum[j]=-1;
    j=0;
    for(i=1;i<=nMX;i++)
        if(prnum[i]!=-1)
            pr[++j]=prnum[i];
    re j;
}*/

/*ll m_ncr[10001][10001];
ll ncr(ll i,ll j)
{
    if(j==1) re i;
    if(i==j) re 1;
    if(m_ncr[i][j]!=-1) re m_ncr[i][j];
    re m_ncr[i][j]=ncr(i-1,j) + ncr(i-1,j-1);
}*/

/*ll m_fact[21];
ll fact(ll i)
{
    if(i==1 || i==0) re 1;
    if(m_fact[i]!=-1) re m_fact[i];
    re m_fact[i]=i*fact(i-1);
}*/


/*#define MX 200005
ll int arr[MX];
ll int tree[MX * 3];
void init(ll int node, ll int b, ll int e)
{
    if (b == e) {
        tree[node] = arr[b];
        return;
    }
    ll int Left = node * 2;
    ll int Right = node * 2 + 1;
    ll int mid = (b + e) / 2;
    init(Left, b, mid);
    init(Right, mid + 1, e);
    tree[node] = max(tree[Left], tree[Right]);
}
ll int query(ll int node, ll int b, ll int e, ll int i, ll int j)
{
    if (i > e || j < b)
        return -1e6;
    if (b >= i && e <= j)
        return tree[node];
    ll int Left = node * 2;
    ll int Right = node * 2 + 1;
    ll int mid = (b + e) / 2;
    ll int p1 = query(Left, b, mid, i, j);
    ll int p2 = query(Right, mid + 1, e, i, j);
    return max(p1, p2);
}
void updateRange(ll int node, ll int start, ll int endd, ll int l, ll int r, ll int val)
{
    // out of range
    if (start > endd or start > r or endd < l)
        return;

    // Current node is a leaf node
    if (start == endd)
    {
        // Add the difference to current node
        tree[node] += val;
        return;
    }

    // If not a leaf node, recur for children.
    ll int mid = (start + endd) / 2;
    updateRange(node*2, start, mid, l, r, val);
    updateRange(node*2 + 1, mid + 1, endd, l, r, val);

    // Use the result of children calls to update this node
    tree[node] = tree[node*2] + tree[node*2+1];
}*/

ll kkk[1000];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll int i,j,x,y,n,m,cnt=0,k,g,flg,t;
    string s;
    cin>>s;
    n=sz(s);
    s="l"+s;
    fr(i,1,n)
    {
        kkk[s[i]]=1;
    }
    if(n<26)
    {
        fr(i,'a','z')
        {
            if(!kkk[i])
            {
                cout<<s.substr(1,n)<<(char) i;
                re 0;
            }
        }
        cout<<-1;
    }
    else
    {
        fr_(i,n,1)
        {
            fr(j,s[i],'z')
            {
                if(!kkk[j])
                {
                    s[i]=(char) j;
                    cout<<s.substr(1,i);
                    re 0;
                }
            }
            kkk[s[i]]=0;
        }
        cout<<-1;
    }
}


Measured memory_bytes: 256