#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <functional>
#include <sstream>
#include <complex>
#include <climits>
using namespace std;

#define REP(i,a,n) for(int i=(a);i<(int)(n);i++)
#define rep(i,n) REP(i,0,n)
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define EPS 1e-8

int num[10];
int check[10];
vector<int> v;

bool solve(){
	int k;
	for(k=1; k<=9 && num[k]==0; k++);
	if( k==10 ){
		return true;
	}
	REP(i,1,10)if( num[i]>0 ){
		if( i<=7 && num[i]>0 && num[i+1]>0 && num[i+2]>0 ){
			num[i]--; num[i+1]--; num[i+2]--;
			if( solve() ) return true;
			num[i]++; num[i+1]++; num[i+2]++;
		}else if( num[i]>=3 ){
			num[i] -= 3;
			if( solve() ) return true;
			num[i] += 3;
		}
	}
	return false;
}

int main(){
	string in;
	int tmp[10];
	while(cin>>in){
		v.clear();
		rep(i,10)check[i]=num[i]=0;
		rep(i,in.size())num[in[i]-'0']++;
		rep(i,10)if( num[i]>=4 )check[i]=1;
		rep(i,10)tmp[i]=num[i];
		
		REP(i,1,10)if( !check[i] ){
			rep(j,10)num[j]=tmp[j];
			num[i]++;
			REP(j,1,10)if( num[j]>=2 ){
				num[j]-=2;
				if( solve() ){ v.push_back(i); break; }
				num[j]+=2;
			}
			num[i]--;
		}
		//cout << v.size() << endl;
		
		if( v.size()>0 ){
			sort(all(v));
			rep(i,v.size()){
				if( i!=0 )putchar(' ');
				printf("%d",v[i]);
			}puts("");
		}else{
			puts("0");
		}
	}
	return 0;
}