#include <bits/stdc++.h>
using namespace std;

vector<int> perse(long long n) {
  vector<int> ret;
  while (n) {
    ret.push_back(n % 10);
    n /= 10;
  }
  sort(ret.begin(), ret.end());

  return ret;
}

vector<int> available(vector<int> &v) {
  vector<int> ret;
  for (int i = 1; i < 10; ++i) {
    int cnt = 0;
    for (int j : v)
      if (i == j) cnt++;
    if (cnt < 4) ret.push_back(i);
  }

  return ret;
}

bool dfs(vector<int> cnt, int v = 0, int used = 0) {
  if (used == 4) return true;

  bool ret = false;

  if (cnt[v] >= 3) {
    cnt[v] -= 3;
    if (dfs(cnt, v, used + 1)) ret = true;
    cnt[v] += 3;
  }

  if (cnt[v]) {
    int t = 0;
    for (int i = 0; i < 3; ++i) {
      if (v + i == 10) continue;
      if (cnt[v + i]) t++;
    }

    if (t == 3) {
      for (int i = 0; i < 3; ++i) {
        cnt[v + i]--;
      }
      if (dfs(cnt, v, used + 1)) ret = true;
      for (int i = 0; i < 3; ++i) {
        cnt[v + i]++;
      }
    }
  } else {
    if (dfs(cnt, v + 1, used)) ret = true;
  }

  return ret;
}

bool solve(int n, vector<int> v) {
  vector<int> cnt(10);
  cnt[n]++;
  for (int i : v) cnt[i]++;

  for (int i = 1; i < 10; ++i) {
    if (cnt[i] >= 2) {
      cnt[i] -= 2;
      if (dfs(cnt)) return true;
      cnt[i] += 2;
    }
  }

  return false;
}

int main() {
  long long data;
  while (cin >> data) {
    vector<int> ans;

    vector<int> v = perse(data);
    vector<int> num = available(v);

    for (int i : num) {
      if (solve(i, v)) ans.push_back(i);
    }

    if (ans.size() == 0) cout << 0 << endl;
    for (int i = 0; i < ans.size(); ++i) {
      cout << ans[i] << (i + 1 == ans.size() ? "\n" : " ");
    }
  }
}