#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>	// require sort next_permutation count __gcd reverse etc.
#include <cstdlib>	// require abs exit atof atoi 
#include <cstdio>		// require scanf printf
#include <functional>
#include <numeric>	// require accumulate
#include <cmath>		// require fabs
#include <climits>
#include <limits>
#include <cfloat>
#include <iomanip>	// require setw
#include <sstream>	// require stringstream 
#include <cstring>	// require memset
#include <cctype>		// require tolower, toupper
#include <fstream>	// require freopen
#include <ctime>		// require srand
#define rep(i,n) for(int i=0;i<(n);i++)
#define ALL(A) A.begin(), A.end()

using namespace std;

typedef long long ll;
typedef pair<int, int> P;

/*
	4個同じものがある場合は３枚一組
	1枚しかない場合は、連続したものを取る
	3枚同じものがある場合は３枚一組
	これで頭があればOK。
*/
bool tactics1 (map<int,int> curr )
{
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 4 ) curr[j] -= 3;
	} // end for
	for (int j = 1; j <= 7; j++ ){
		if (curr[j] == 1 && curr[j+1] >= 1 && curr[j+2] >= 1 ){
			curr[j]--; curr[j+1]--; curr[j+2]--;
		} // end if
	} // end for
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 3 ) curr[j] -= 3;
	} // end for
	bool head = false;
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 2 && !head ){
			head = true; curr[j] -= 2;
		} // end if
	} // end for

	if (!head ) return false;

	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 0 ) continue;
		return false;
	} // end for

	return true;
}
/*
	4個同じものがある場合は３枚一組
	2枚以上ある場合は、先に頭を作る。
	そのあと１枚になった場合は、連続したものを取る
	3枚同じものがある場合は３枚一組
	これで残りがなければOK。
*/
bool tactics2 (map<int,int> curr )
{
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 4 ) curr[j] -= 3;
	} // end for

	bool head = false;
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] > 1 && !head ){
			curr[j] -= 2; head = true;
		} // end if
	} // end for
	if (!head ) return false;

	for (int j = 1; j <= 7; j++ ){
		if (curr[j] == 1 && curr[j+1] >= 1 && curr[j+2] >= 1 ){
			curr[j]--; curr[j+1]--; curr[j+2]--;
		} // end if
	} // end for
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 3 ) curr[j] -= 3;
	} // end for

	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 0 ) continue;
		return false;
	} // end for

	return true;
}
/*
	4個同じものがある場合は３枚一組
	2枚以上ある場合は、先に連続したものを取る
	3枚同じものがある場合は３枚一組
	これで頭があればOK。
*/

bool tactics3 (map<int,int> curr )
{
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 4 ) curr[j] -= 3;
	} // end for

	while (1 ){
		map<int,int> prev = curr;
		for (int j = 1; j <= 7; j++ ){
			if (curr[j] >= 1 && curr[j+1] >= 1 && curr[j+1] >= 1 ){
				curr[j]--; curr[j+1]--; curr[j+2]--;
			} // end if
		} // end for
		if (prev == curr ) break;
	} // end while

	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 3 ) curr[j] -= 3;
	} // end for

	bool head = false;
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] > 1 && !head ){
			curr[j] -= 2; head = true;
		} // end if
	} // end for

	if (!head ) return false;
	
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 0 ) continue;
		return false;
	} // end for

	return true;
}
/*
	2枚以上ある場合は、先に連続したものを取る
	3枚同じものがある場合は３枚一組
	4個同じものがある場合は３枚一組
	これで頭があればOK。
*/

bool tactics4 (map<int,int> curr )
{
	for (int j = 1; j <= 7; j++ ){
		while (1 ){
			map<int,int> prev = curr;
			if (curr[j] >= 1 && curr[j+1] >= 1 && curr[j+1] >= 1 ){
				curr[j]--; curr[j+1]--; curr[j+2]--;
			} // end if
			if (prev == curr ) break;
		} // end while
	} // end for

	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 3 || curr[j] == 4 ) curr[j] -= 3;
	} // end for

	bool head = false;
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] > 1 && !head ){
			curr[j] -= 2; head = true;
		} // end if
	} // end for

	if (!head ) return false;
	
	for (int j = 1; j <= 9; j++ ){
		if (curr[j] == 0 ) continue;
		return false;
	} // end for

	return true;
}

int main()
{
//	cut here before submit 
//	freopen ("testcase.Puzzle3", "r", stdin );
	string str = "";
	while (getline (cin, str ) ){
		int n = str.length();
		map<int,int> pai;		// 牌の個数
		rep (i, n ){
			pai[(int)(str[i] - '0')]++;
		} // end rep

		vector<int> cand; cand.clear();
		for (int i = 1; i <= 9; i++ ){
			if (pai[i] >= 0 && pai[i] < 4 ){
				cand.push_back (i );
			} // end if
		} // end for
		vector<int> res; res.clear();
		rep (i, cand.size() ){
			map<int,int> curr = pai;
			curr[cand[i]]++;
			if ( tactics1 (curr ) 
			|| tactics2 (curr ) 
			|| tactics3 (curr )
			|| tactics4 (curr ) ){
				res.push_back (cand[i] );
			} // end if
		} // end rep
		if (res.empty() ){
			cout << 0 << endl;
		}else{
			rep (i, res.size() ){
				cout << res[i] << (i != res.size() - 1 ? ' ' : '\n' );
			} // end rep
		} // end if
	} // end while

	return 0;
}