#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <cstring>
#include <sstream>
#include <cassert>
using namespace std;
static const double EPS = 1e-5;
typedef long long ll;
typedef pair<int,int> PI;
#define rep(i,n) for(int i=0;i<(int)n;++i)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(), (c).end()
#define MP make_pair
#define PB push_back

void printvec(vector<int>&);

bool perfect(map<int,int> jan,bool head){

  int wa=0;
  FOR(miter,jan)wa+=miter->second;
  if(!wa)return true;

  bool syuntu=false,ko_tu=false,tou=false;
  rep(i,8){
    if(!i)continue;
    if(jan[i] && jan[i+1] && jan[i+2]){
      map<int,int> tt(jan);
      tt[i]--,tt[i+1]--,tt[i+2]--;
      if(perfect(tt,head))syuntu=true;
    }
  }

  rep(i,10){
    if(!i)continue;
    if(jan[i]>=3){
      map<int,int> tt(jan);
      tt[i]-=3;
      if(perfect(tt,head))ko_tu=true;
    }
  }

  if(!head){
    rep(i,10){
      if(!i)continue;
      if(jan[i]>=2){
        map<int,int> tt(jan);
        tt[i]-=2;
        if(perfect(tt,true))tou=true;
      }
    }
  }
  return tou||syuntu||ko_tu;
}

void print(set<int> in){
  FOR(setiter,in){
    if(setiter==in.begin())cout<<*setiter;
    else cout<<" "<<*setiter;
  }
  cout<<endl;
}

int main(){
  string str;
  while(cin>>str){
    vector<int> in;
    rep(i,str.size())in.PB(str[i]-'0');

    set<int> out;
    rep(i,10){
      if(i==0)continue;
      bool skip=false;
      vector<int> add(in);
      add.PB(i);
      map<int,int> jan;
      FOR(viter,add){
        jan[*viter]++;
        if(jan[*viter]>4)skip=true;
      }
      if(skip)continue;

      if(perfect(jan,false))out.insert(i);
    }
    if(out.size()==0)puts("0");
    else print(out);
  }
}