import std.stdio;

/**
解き方

1 <= A <= 500
1 <= B <= 500
上記の制約からして、要素数の最大値は1,000
一方でグリッドの大きさはh=100, w=100で決め打ちにすれば必ず10マスに1マスは割り当てれる
つまり解答例のような小さめのグリッドで効率よく埋める必要はない

上半分は白地(.)に一マスずつ黒(#)を置くために使う (最大 33x49=1617個)
0   #..#..#..
1   ..#..#..#
2   #..#..#..
|
49  .........
50  #########
51  ##.##.##.
52  .##.##.##
53  ##.##.##.
|
100 .##.##.##
下半分は黒地(#)に一マスずつ白(.)を置くために使う

 */
void main() {
    int a, b;
    readf("%d %d\n", &a, &b);
    writeln("100 100");
    // 1 for background
    int black = 1;
    int white = 1;

    // upper for black on white
    foreach (h; 0 .. 49) {
        foreach (w; 0 .. 100) {
            if (((h % 2 == 0 && w % 3 == 0) || (h % 2 == 1 && w % 3 == 2)) && black < b) {
                write("#");
                ++black;
            }
            else {
                write(".");
            }
        }
        writeln();
    }
    // last row for white boundary
    foreach (w; 0 .. 100) {
        write(".");
    }
    writeln();

    // 50th row for white boundary
    foreach (w; 0 .. 100) {
        write("#");
    }
    writeln();
    // lower for white on black
    foreach (h; 51 .. 100) {
        foreach (w; 0 .. 100) {
            if (((h % 2 == 0 && w % 3 == 0) || (h % 2 == 1 && w % 3 == 2)) && white < a) {
                write(".");
                ++white;
            }
            else {
                write("#");
            }
        }
        writeln();
    }
}
