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

const int N = 14;
int T[N];
int mem[1<<N];

int f(int used, int head, int d) {
  used |= (1<<head);
  for(int i = 1; i < 3; ++i) {
    bool flag = false;
    int u = T[head]+i*d;
    for(int j = lower_bound(T, T+N, u) - T;
        j < N && T[j] == u; ++j) {
      if(used & (1<<j)) continue;
      flag = true;
      used |= (1<<j);
      break;
    }
    if(!flag) return 0;
  }
  return used;
}

bool rec(int used) {
  int &res = mem[used];
  if(res != -1) return res;
  if(N - __builtin_popcount(used) == 2) {
    int tmp[2];
    for(int i = 0, j = 0; i < N; ++i) {
      if(used & (1<<i)) continue;
      tmp[j++] = T[i];
    }
    return res = (tmp[0] == tmp[1]);
  }
  res = 0;
  for(int i = 0; i < N; ++i) {
    if(used&(1<<i)) continue;
    for(int d = 0; d <= 1; ++d) {
      int nused = f(used, i, d);
      if(!nused) continue;
      if(rec(nused)) return res = true;
    }
  }
  return res = false;
}

int main() {
  string s;
  while(cin >> s) {
    int num[10];
    fill(num, num+10, 0);
    for(int i = 0; i < s.size(); ++i) ++num[s[i] - '0'];
    vector<int> v;
    for(char c = 1; c <= 9; ++c) {
      if(num[c] == 4) continue;
      for(int i = 0; i < s.size(); ++i) T[i] = s[i] - '0';
      T[N-1] = c;
      sort(T, T+N);
      fill(mem, mem+(1<<N), -1);
      if(rec(0)) v.push_back(c);
    }
    if(v.empty()) v.push_back(0);
    for(int i = 0; i < v.size(); ++i) {
      if(i) cout << " ";
      cout << v[i];
    }
    cout << endl;
  }
  return 0;
}