#include <cstring>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

const int Dx[] = {-1, 0, 1, 0},
          Dy[] = {0, -1, 0, 1};
const int INF = 0x3f3f3f3f;

char A[30][20][20];
bool S[20][20];
int dist[402], daux[402], dnow[402];
int who[30];
int size[402], mx[402], my[402];
int ST[402], result[402];
int comp[20][20], compnow;
int colcomp[402];
queue<int> Q;

int colnow;
void fill(int x, int y, int cmpnow)
{
	if (x < 1 || y < 1 || x > 14 || y > 14 || comp[x][y] || A[result[0]][x][y] - '0' != colnow) return;
	comp[x][y] = cmpnow;
	mx[cmpnow] += x;
	my[cmpnow] += y;
	++size[cmpnow];
	
	for (int i = 0; i < 4; ++i)
		fill(x + Dx[i], y + Dy[i], cmpnow);
}
void getdist(int now)
{
	for (int i = 1; i <= compnow; ++i)
		dist[i] = INF;
	dist[now] = 0;
	Q.push(now);
		
	while (!Q.empty())
	{
		int now = Q.front();
		Q.pop();
		
		for (int i = 1; i <= 14; ++i)
			for (int j = 1; j <= 14; ++j)
				if (comp[i][j] == now)
					for (int k = 0; k < 4; ++k)
						if (i + Dx[k] >= 1 && i + Dx[k] <= 14 && j + Dy[k] >= 1 && j + Dy[k] <= 14)
							if (dist[comp[i + Dx[k]][j + Dy[k]]] == INF)
							{
								dist[comp[i + Dx[k]][j + Dy[k]]] = dist[now] + 1;
								Q.push(comp[i + Dx[k]][j + Dy[k]]);
							}
	}
}

int main()
{
	cin.sync_with_stdio(false);
	
	int N = 14;
	for (int i = 1; i <= N; ++i)
		cin >> (A[0][i] + 1);
	
	srand(time(0));
	
	while (true)
	{
		memset(comp, 0, sizeof(comp));
		memset(size, 0, sizeof(size));
		memset(mx, 0, sizeof(mx));
		memset(my, 0, sizeof(my));
		memset(colcomp, 0, sizeof(colcomp));
		
		compnow = 0;
		for (int i = 1; i <= N; ++i)
			for (int j = 1; j <= N; ++j)
				if (!comp[i][j])
				{
					colnow = A[result[0]][i][j] - '0';
					fill(i, j, ++compnow);
					colcomp[compnow] = colnow;
				}
		
		getdist(1);
		memcpy(daux, dist, sizeof(daux));
		
		memset(dnow, 0, sizeof(dnow));
		
		bool any = false;
		for (int i = 1; i <= compnow; ++i)
			if (daux[i] == 1)
			{
				any = true;
				
				getdist(i);
				for (int j = 1; j <= compnow; ++j)
					dnow[i] = max(dnow[i], dist[j]);
			}
		if (!any) break;
		
		int cand = 0, eq = 0;
		for (int i = 1; i <= compnow; ++i)
			if (daux[i] == 1 && (cand == 0 || dnow[i] < dnow[cand]))
			{
				cand = i;
				eq = 1;
			}
			else if (daux[i] == 1 && dnow[i] == dnow[cand])
				++eq;
		
		int fin = 0, rem = who[result[0]];
		for (int i = 1; i <= compnow; ++i)
			if (daux[i] == 1 && dnow[i] == dnow[cand] && rem != 0)
				--rem;
			else if (daux[i] == 1 && dnow[i] == dnow[cand])
			{
				fin = i;
				break;
			}
		
		if (eq != 1)
			who[result[0]] = (who[result[0]] + rand() % (eq - 1) + 1) % eq;
		
		
		result[++result[0]] = colcomp[fin];
		for (int i = 1; i <= N; ++i)
			for (int j = 1; j <= N; ++j)
			{
				A[result[0]][i][j] = A[result[0] - 1][i][j];
				if (daux[comp[i][j]] == 0)
					A[result[0]][i][j] = colcomp[fin] + '0';
			}
		
		if (result[0] > 25)
			result[0] = rand() % 25;
	}
	
	for (int i = 1; i <= result[0]; ++i)
		cout << result[i] << ' ';
	cout << '\n';
}