unittest
{
//	assert( [ "2 3" ].parse.expand.solve == "3 3\n##.\n..#\n#.#" );
//	assert( [ "7 8" ].parse.expand.solve == "3 5\n#.#.#\n.#.#.\n#.#.#" );
//	assert( [ "1 1" ].parse.expand.solve == "4 2\n..\n#.\n##\n##" );
//	assert( [ "3 14" ].parse.expand.solve == "8 18\n..................\n..................\n....##.......####.\n....#.#.....#.....\n...#...#....#.....\n..#.###.#...#.....\n.#.......#..#.....\n#.........#..####." );
}



import std.conv;
import std.format;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto ab = input.front.split.to!( long[] );
	return tuple( ab[ 0 ], ab[ 1 ] );
}

auto solve( long a, long b )
{
	auto ansss = new char[][]( 40, 100 );
	a--;
	b--;
	
	// 黒地に白点を打つ
	for( auto y = 0L; y < ansss.length / 2; y += 2 )
	{
		ansss[ y     ][] = '#';
		ansss[ y + 1 ][] = '#';
		for( auto x = 0L; x < ansss[ y ].length && 0 < a; x += 2 )
		{
			ansss[ y ][ x ] = '.';
			a--;
		}
	}
	
	// 白地に黒点を打つ
	for( auto y = ansss.length.signed / 2 + 1; y < ansss.length; y += 2 )
	{
		ansss[ y - 1 ][] = '.';
		ansss[ y     ][] = '.';
		for( auto x = 0L; x < ansss[ y ].length && 0 < b; x += 2 )
		{
			ansss[ y ][ x ] = '#';
			b--;
		}
	}
	return format( "%s %s\n%s", ansss.length, ansss[ 0 ].length, ansss.join( '\n' ) );
}
