#include <iostream>
#include <queue>
using namespace std;
const int N = 4;
bool State[65536];
bool Find = false;
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
struct rec
{
bool map[N][N];
int step;
};
rec start;
queue<rec> q;
int GetSate(bool map[][N])
{
int sum = 0;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
if(map[i][j])
sum += 1;
else
sum <<= 1;
}
return sum;
}
void Change(rec& r, int i, int j)
{
int k;
int x;
int y;
r.map[i][j] = !r.map[i][j];
for(k = 0; k < N; k++)
{
x = i+dir[k][0];
y = j+dir[k][1];
if(x >= 0 && x < N && y >= 0 && y < N)
{
r.map[x][y] = !r.map[x][y];
}
}
}
void Init()
{
char ch;
for(int i = 0; i < 65536; i++)
State[i] = true;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
{
cin >> ch;
if(ch == 'b')
start.map[i][j] = true;
else
start.map[i][j] = false;
}
start.step = 0;
q.push(start);
State[GetSate(start.map)] = false;
}
bool Check(bool map[N][N])
{
bool Stand = map[0][0];
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(map[i][j] != Stand)
return false;
return true;
}
void BFS()
{
rec r, t;
int i;
int j;
int temp;
if(!q.empty())
{
r = q.front();
q.pop();
if(Check(r.map))
{
cout << r.step << endl;
Find = true;
return;
}
else
{
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
{
t = r;
Change(t, i, j);
temp = GetSate(t.map);
if(State[temp])
{
t.step += 1;
q.push(t);
State[temp] = false;
}
}
}
BFS();
}
}
int main()
{
Init();
BFS();
if(!Find)
cout << "Impossible" << endl;
return 0;
}