#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <queue>

typedef std::vector<char> column;
typedef std::vector<column> gamefield;
typedef std::pair<int, int> index;

std::istream& operator>>(std::istream& in, gamefield &gf)
{
  std::vector<std::string> lines;
  for (std::string s; std::getline(in, s); assert(s.size() == lines.front().size()))
    lines.push_back(s);

  if (lines.empty())
    in.setstate(std::ios::failbit);
  gf.resize(2+lines.front().size(), std::vector<char>(1, '\0'));
  gf.front() = gf.back() = std::vector<char>(2+lines.size(), '\0');

  for (int y=lines.size()-1; y>=0; --y)
    for (int x=0; x<lines.front().size(); ++x)
      gf[1+x].push_back(lines[y][x]);

  return in;
}

std::ostream& operator<<(std::ostream& out, gamefield const& gf)
{
  assert(!gf.empty());
  for (int x=gf.front().size()-2; x>0; --x, out << '\n')
    for (int y=1; y<gf.size()-1; ++y)
      out << (gf[y][x] ? gf[y][x] : '-');
  return out;
}

void pop(gamefield& gf, index idx)
{
  char color_to_remove = gf[idx.first][idx.second];
  std::queue<index> q;
  q.push(idx);
  while (!q.empty()) {
    int y = q.front().first;
    int x = q.front().second;
    q.pop();

    gf[y][x] = '\0';
#undef check
#define check(dy, dx) /* ein macro ist hier einfachsten */              \
    if (gf[y+dy][x+dx] == color_to_remove) q.push(std::make_pair(y+dy, x+dx))
    
    check(+1, -1); check(+1, 0); check(+1, +1);
    check( 0, -1);               check( 0, +1);
    check(-1, -1); check(-1, 0); check(-1, +1);
#undef check
  }

  for (int i=1; i<gf.size()-1; ++i)
    std::fill(std::remove(gf[i].begin()+1, gf[i].end(), '\0'), gf[i].end(), '\0');
}

int main()
{
  gamefield gf;
  std::cin >> gf;
  std::cout << gf << '\n';

  pop(gf, std::make_pair(1, 1));

  std::cout << gf << '\n';
}
