#include <stdio.h>
#include <string.h>

int N,M;
char s[1000][1000];
char w[1000][1000];

int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};

/* Depth-First search of the bipartite graph */
int look(int x, int y, int px, int py, int side)
{
	w[x][y]=1;

	if(side)
	{
		int ok;
			
		switch(s[x][y])
		{
			case 'l': ok=look(x,y+1,x,y,0); break;
			case 'r': ok=look(x,y-1,x,y,0); break;
			case 't': ok=look(x+1,y,x,y,0); break;
			case 'b': ok=look(x-1,y,x,y,0); break;
			default : ok=1; break;
		}

		if(ok)
		{
		  if((x-px==-1) && (y-py== 0)) { s[x][y]='t'; s[px][py]='b'; };
		  if((x-px==+1) && (y-py== 0)) { s[x][y]='b'; s[px][py]='t'; };
		  if((x-px== 0) && (y-py==-1)) { s[x][y]='l'; s[px][py]='r'; };
		  if((x-px== 0) && (y-py==+1)) { s[x][y]='r'; s[px][py]='l'; };
		}

		return ok;
	}
	else
	{
		int i;

		for(i=0; i<4; i++)
		if((0<=x+dx[i]) && (x+dx[i]<N) && (0<=y+dy[i]) && (y+dy[i]<M)) 
		if(s[x+dx[i]][y+dy[i]]!='.')
		if(!w[x+dx[i]][y+dy[i]])
		{
			if(look(x+dx[i], y+dy[i], x,y, 1)) return 1;
		}
	}

	return 0;	
}

int main()
{
	while(1)
	{
		int i,j,ok;

		if(scanf("%d %d", &N, &M)!=2) break;
		if(N==0 || M==0) break;
		for(i=0; i<N; i++) scanf("%s", s[i]);

		/* repeatedly find an augmenting path */
		do
		{
			ok = 0;
			memset(w, 0, sizeof(w));

			for(i=0; i<N; i++)
			for(j=0; j<M; j++)
			if(s[i][j]=='#')
			if(!w[i][j])
			if(look(i,j,-1,-1,0))
			       	ok = 1;
		}
		while(ok);

		/* check if all hashes have vanished */
		ok = 1;
		for(i=0; i<N; i++)
		for(j=0; j<M; j++)
		if(s[i][j]=='#')
		{
			ok = 0;
		}

		if(ok)	
			for(i=0; i<N; i++) printf("%s\n", s[i]);
		else
			printf("IMPOSSIBLE\n");

		printf("\n");
	}

	
	return 0;
}
