Problem:
Score : 200 points

Problem Statement

There is a grid of squares with H horizontal rows and W vertical columns.
The square at the i-th row from the top and the j-th column from the left is represented as (i, j).
Each square is black or white.
The color of the square is given as an H-by-W matrix (a_{i, j}).
If a_{i, j} is ., the square (i, j) is white; if a_{i, j} is #, the square (i, j) is black.

Snuke is compressing this grid.
He will do so by repeatedly performing the following operation while there is a row or column that consists only of white squares:

Operation: choose any one row or column that consists only of white squares, remove it and delete the space between the rows or columns.

It can be shown that the final state of the grid is uniquely determined regardless of what row or column is chosen in each operation.
Find the final state of the grid.

Constraints

1 \leq H, W \leq 100

a_{i, j} is . or #.

There is at least one black square in the whole grid.

Input

Input is given from Standard Input in the following format:

H W
a_{1, 1}...a_{1, W}
:
a_{H, 1}...a_{H, W}

Output

Print the final state of the grid in the same format as input (without the numbers of rows and columns); see the samples for clarity.

Sample Input 1

4 4
##.#
....
##.#
.#.#

Sample Output 1

###
###
.##

The second row and the third column in the original grid will be removed.

Sample Input 2

3 3
#..
.#.
..#

Sample Output 2

#..
.#.
..#

As there is no row or column that consists only of white squares, no operation will be performed.

Sample Input 3

4 5
.....
.....
..#..
.....

Sample Output 3

#

Sample Input 4

7 6
......
....#.
.#....
..#...
..#...
......
.#..#.

Sample Output 4

..#
#..
.#.
.#.
#.#

Solution in C (GCC 9.2.1) (judge verdict: Accepted)

/* ex7_3
    fmuacshai */

# include<stdio.h>
# include<stdlib.h>

int main(void){
    //縦の行数をheight、横の列数をwideとする
    int height,wide,i;
    //squareを動的確保して定義
    char **square;
    //sensorhとsensorwを動的確保して定義
    int *sensorh,*sensorw;
    //heightの入力
    scanf("%d",&height);
    //wideの入力
    scanf("%d",&wide);
    //マス目の配列をsquareとする
    square=(char**)calloc(height, sizeof(char*));
    if(square==NULL){
        printf("memory allocation error.\n");
        exit(1);
    }
    for(i=0;i<height;i++){
        square[i]=(char*)calloc(wide, sizeof(char));
        if(square[i]==NULL){
            printf("memory allocation error.\n");
            exit(1);
        }
    }
    //縦の列を残すか判別する配列をsensorh[]、
    //横の列を残すか判別する配列をsensorw[]とする
    sensorh=(int*)calloc(height, sizeof(int));
    if(sensorh==NULL){
        printf("memory allocation error.\n");
        exit(1);
    }
    sensorw=(int*)calloc(wide, sizeof(int));
    if(sensorw==NULL){
        printf("memory allocation error.\n");
        exit(1);
    }
    //squeres[height][wide]を入力
    for(int i=0;i<height;i++){
        for(int j=0;j<wide;j++){
            scanf(" %c",&square[i][j]);
        }
    }
    //sensorhの中身を全て0にする
    for(int i=0;i<height;i++){
        sensorh[i]=0;
    }
    //sensorwの中身を全て0にする
    for(int j=0;j<wide;j++){
        sensorw[j]=0;
    }
    //'#'が入力されているところに対応する行と列を把握する
    for(int i=0;i<height;i++){
        for(int j=0;j<wide;j++){
            //'#'だったら
            if(square[i][j]=='#'){
                //対応する部分の配列に1を入力
                sensorh[i]=1;
                sensorw[j]=1;
            }
        }
    }
    //対応する行列がどちらも1が入力されていたらを出力
    for(int i=0;i<height;i++){
        for(int j=0;j<wide;j++){
            //対応する行列がどちらも1が入力されていたら
            if(sensorh[i]==1 && sensorw[j]==1){
                //squeres[i][j]を出力
                printf("%c",square[i][j]);
            }
        }
        //消されなかったものがあった列は最後に改行
        if(sensorh[i]==1){
            printf("\n");
        }
    }
  //メモリの解放
    for(i=0;i<height;i++){
        free(square[i]);
    }
    free(square);
    free(sensorh);
    free(sensorw);
    
    return 0;
}