#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define rep(i,n) for(int i=0; i<int(n); i++)
#define all(c) (c).begin(), (c).end()
using namespace std;

bool canMakeRec(vector<int> ns) {
  if (ns.size() == 0) return true;
  int first = ns[0];  // どの順番に役を作っても結果は変わらないので、まず最初の数に着目する。配列はソートされているのでこれは使える数字の中で最小になる
  if (count(all(ns), first) >= 3) {  // 同じ数字が3個以上ある
    vector<int> nsNew = ns;  // 現在の数字をコピー
    rep(i,3) nsNew.erase( find(all(nsNew), first) );  // 3個消す
    if (canMakeRec(nsNew)) return true;
  }
  if (count(all(ns), first+1) > 0 && count(all(ns), first+2)) {  // 3つの連続する数字がある
    vector<int> nsNew = ns;  // 現在の数字をコピー
    rep(i,3) nsNew.erase( find(all(nsNew), first + i) );  // 3個消す
    if (canMakeRec(nsNew)) return true;
  }
  return false;
}

bool canMake(vector<int> ns) {
  sort(all(ns));
  // まず2つ組を作る
  int prev = -1;
  rep(i, ns.size()-1) {
    if (prev != ns[i] && ns[i] == ns[i+1]) {
      vector<int> nsNew = ns;  // 現在の数字をコピー
      nsNew.erase(nsNew.begin() + i);  // 2つ消す
      nsNew.erase(nsNew.begin() + i);
      if (canMakeRec(nsNew)) return true;
    }
    prev = ns[i];
  }
  return false;
}

int main() {
  string s;
  while (cin >> s) {
    vector<int> ns(14);
    vector<int> freq(10);  // freq[i]: 数iが現れた回数
    rep(i,13) {
      ns[i] = s[i] - '0';
      freq[ns[i]]++;
    }
    vector<int> ans;

    for (int i = 1; i <= 9; i++) {
      ns[13] = i;
      if (freq[i] < 4 && canMake(ns)) ans.push_back(i);
    }

    if (ans.size() == 0) cout << 0;
    else {
      cout << ans[0];
      rep(i, ans.size()-1) cout << " " << ans[i+1];
    }
    cout << endl;
  }
  return 0;
}