#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cctype>
#include<complex>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<functional>
#include<utility>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<set>

using namespace std;
const int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
#define INF 1e+9
#define EPS 1e-9
#define rep(i,j) for(int i = 0; i < (j); i++)
#define reps(i,j,k) for(int i = j; i < (k); i++)
typedef long long ll;
int num[10];
vector<int> res;
bool check(int *ar,int cnt){
    int tmp[10]={0};
    rep(i,10)tmp[i] = ar[i]; 
    if(cnt == 4)return true;
    reps(i,1,10){
        if(tmp[i] < 3)continue;
        tmp[i] -= 3;
        if(check(tmp,cnt+1)) return true;
        tmp[i] += 3;
    }
    reps(i,1,8){
        if(tmp[i] < 1 || tmp[i+1] < 1 || tmp[i+2] < 1) continue;
        tmp[i]--;
        tmp[i+1]--;
        tmp[i+2]--;
        if(check(tmp,cnt+1)) return true;
        tmp[i]++;
        tmp[i+1]++;
        tmp[i+2]++;
    }
    return false;
}
void solve(){
    reps(i,1,10){
        if(num[i] < 4)num[i]++;
        else continue;
        reps(j,1,10){
            bool f = false;
            if(num[j] > 1){
                num[j] -= 2;
                if(check(num,0)){
                    res.push_back(i);
                    f = true;
                }
                num[j] += 2;
            }
            if(f)break;
        }
        num[i]--;
    }
}
int main(){
    char str[16];
    while(~scanf("%s",str)){
        memset(num,0,sizeof(num));
        res.clear();
        rep(i,13)num[str[i]-48]++;
        solve();
        if(res.size() == 0){
            puts("0");
        }
        else{
            rep(i,res.size()-1)printf("%d ",res[i]);
            printf("%d\n",res[res.size()-1]);
        }
    }
    return 0;
}