#include<cstdio>
#include<algorithm>


//mapの最大値
#define INDEX_WHMAP_MAX		12
//マップ(１番大きいとする)
int wh_map[INDEX_WHMAP_MAX][INDEX_WHMAP_MAX];
//四方を見るための配列
const int h_tate[4] = {1 , -1 , 0 , 0};
const int h_yoko[4] = {0 , 0 , 1 , -1};
//入力方法がわからないから文字で受け取る
char str_nyuuryoku[INDEX_WHMAP_MAX][INDEX_WHMAP_MAX + 1];




//----- 1つめの島を見つける関数 -----//
int f_firstsima(void);

//----- 島を見つけた場合、陸続きのものがあるかどうか調べる関数 -----//
void f_search(int , int);

//----- マップを初期化する関数 -----//
int f_syokika(void);



//*****----- main -----*****

int main(void)
{
	while (1)
	{
		//最初に初期化する(EOFが返ってきたら終了)
		if (f_syokika() == 0)
		{
			break;
		}

		//戻り値を出力
		int ans = f_firstsima();
		printf("%d\n" , ans);
	}

	return 0;
}




//*****----- 1つめの島を見つける関数 -----*****//

int f_firstsima(void)
{
	//答えをカウントする変数
	int ans = 0;

	//マップの分だけforを回す
	for (int i = 0; i < 12; i++)
	{
		for (int j = 0; j < 12; j++)
		{
			//もしもまだ探索していない島だったら
			if (wh_map[i][j] == 1)
			{
				ans++;
				//再帰関数に現在座標を送って、陸続きのものを消してもらう
				f_search(i , j);
			}
		}
	}

	return ans;
}



//*****----- 島を見つけた場合陸続きなものがあるかどうか調べる関数 -----*****//

void f_search(int y , int x)
{
	//まず現在座標を0とする(島を消すため)
	wh_map[y][x] = 0;
	//四方を見るためにforを回す
	for (int i = 0; i < 4; i++)
	{
		//次の座標を宣言(マップがはみ出ないかどうかは重要である)
		int nextx = x + h_yoko[i];
		int nexty = y + h_tate[i];

		//はみでない
		if (nextx >= 0 && nextx < INDEX_WHMAP_MAX &&
			nexty >= 0 && nexty < INDEX_WHMAP_MAX)
		{
			//　+　陸続きである
			if (wh_map[nexty][nextx] == 1)
			{
				//再帰関数でさらに陸続きの場所がないか操作を続ける
				f_search(nexty , nextx);
			}
		}
	}
}




//*****----- マップ初期化関数の実体 -----*****//

int f_syokika(void)
{
	for (int i = 0; i < 12; i++)
	{
		//１行一気に入力されるらしい
		if (scanf("%s" , str_nyuuryoku[i]) == EOF)
		{
			return 0;
		}
	}

	//戻すのが面倒なので、文字列配列から整数配列へ移す
	for (int i = 0; i < 12; i++)
	{
		for (int j = 0; j < 12; j++)
		{
			wh_map[i][j] = str_nyuuryoku[i][j] - '0';
		}
	}

	return 1;
}