#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;

vector <int> D;
bool two;
bool check( int d ) {
    if ( d >= 10 ) {
        bool ok = true;
        for ( int i = 1; i < 10; i++ ) {
            if ( D[i] > 0 ) {
                ok = false;
            }
        }
        return two && ok;
    }
    if ( d+2 < 10 && D[d] > 0 && D[d+1] > 0 && D[d+2] > 0 ) {
        D[d]--;
        D[d+1]--;
        D[d+2]--;
        if ( check(d) ) return true;
        D[d]++;
        D[d+1]++;
        D[d+2]++;
    }
    if ( D[d] >= 3 ) {
        D[d] -= 3;
        if ( check(d) ) return true;
        D[d] += 3;
    }
    if ( !two && D[d] >= 2 ) {
        D[d] -= 2;
        two = true;
        if ( check(d) ) return true;
        two = false;
        D[d] += 2;
    }
    return check(d+1);
}

int main() {
    string line;
    while ( cin >> line ) {
        D = vector <int>(10,0);
        for ( string ::iterator it = line.begin(); it != line.end(); ++it ) {
            D[*it-'0']++;
        }

        vector <int> T;
        vector <int> backup = D;
        for ( int i = 1; i < 10; i++ ) {
            D = backup;
            D[i]++;
            two = false;
            bool ok = true;
            for ( int j = 1; j < 10; j++ ) {
                if ( D[j] > 4 ) ok = false;
            }
            if ( ok && check( 1 ) ) T.push_back( i );
            D[i]--;
        }

        for ( vector <int> ::iterator it = T.begin(); it != T.end(); ++it ) {
            cout << *it;
            if ( it + 1 != T.end() ) cout << " ";
        }
        if ( T.empty() ) cout << 0;
        cout << endl;
    }
    return 0;
}