using System;
using System.Text;
using System.Collections.Generic;
using static System.Math;
using System.Linq;
using static System.Array;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace AtcoderExpress
{


    class Program2
    {

        static void Main(string[] args)
        {
            var AB = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
            var A  = AB[0];
            var B  = AB[1];
            var countA = 1;
            var countB = 1;
            var map = new char[2*50, 2*50];

            for (int i = 0; i < 2 * 50; i++)
            {
                for (int j = 0; j < 2 * 50; j++)
                {
                    if(i < 50)
                    {
                        map[i, j] = '.';
                    }
                    else
                    {
                        map[i, j] = '#';
                    }
                }
            }

            var flg = true;
            for (int i = 0;flg && i < 50; i += 2)
            {
                for (int j = 0;flg && j < 100; j += 2)
                {
                    if(countB < B)
                    {
                        map[i, j] = '#';
                        countB++;
                    }
                    else
                    {
                        flg = false;
                    }
                }
            }

            flg = true;
            for (int i = 51; flg && i < 100; i += 2)
            {
                for (int j = 0; flg && j < 100; j += 2)
                {
                    if (countA < A)
                    {
                        map[i, j] = '.';
                        countA++;
                    }
                    else
                    {
                        flg = false;
                    }
                }
            }

            Console.WriteLine(100+" "+100);
            for (int i = 0; i < 2 * 50; i++)
            {
                for (int j = 0; j < 2 * 50; j++)
                {
                    Console.Write(map[i,j]);
                }
                Console.WriteLine();
            }

        }
    }
        

    class QueryAndRosd
    {
        public int from;
        public int to  = 0;
        public int year;
        public QueryAndRosd(int year, int from,int to = 0)
        {
            this.from = from;
            this.to = to;
            this.year = year;
        }
    }

    class UnionFind

    {


        // 親要素のインデックスを保持する

        // 親要素が存在しない(自身がルートである)とき、マイナスでグループの要素数を持つ

        public long[] Parents { get; set; }

        public UnionFind(long n)

        {

            this.Parents = new long[n];

            for (int i = 0; i < n; i++)

            {

                // 初期状態ではそれぞれが別のグループ(ルートは自分自身)

                // ルートなのでマイナスで要素数(1個)を保持する

                this.Parents[i] = -1;

            }

        }
        public UnionFind(UnionFind src)

        {

            this.Parents = new long[src.Parents.Length];

            for (int i = 0; i < src.Parents.Length; i++)

            {

                // 初期状態ではそれぞれが別のグループ(ルートは自分自身)

                // ルートなのでマイナスで要素数(1個)を保持する

                this.Parents[i] = src.Parents[i];

            }

        }




        // 要素xのルート要素はどれか

        public long Find(long x)

        {

            // 親がマイナスの場合は自分自身がルート

            if (this.Parents[x] < 0) return x;

            // ルートが見つかるまで再帰的に探す

            // 見つかったルートにつなぎかえる

            this.Parents[x] = Find(this.Parents[x]);

            return this.Parents[x];

        }



        // 要素xの属するグループの要素数を取得する

        public long Size(long x)

        {

            // ルート要素を取得して、サイズを取得して返す

            return -this.Parents[this.Find(x)];

        }



        // 要素x, yが同じグループかどうか判定する

        public bool Same(long x, long y)

        {

            return this.Find(x) == this.Find(y);

        }



        // 要素x, yが属するグループを同じグループにまとめる

        public bool Union(long x, long y)

        {

            // x, y のルート

            x = this.Find(x);

            y = this.Find(y);

            // すでに同じグループの場合処理しない

            if (x == y) return false;



            // 要素数が少ないグループを多いほうに書き換えたい

            if (this.Size(x) < this.Size(y))

            {

                var tmp = x;

                x = y;

                y = tmp;

            }

            // まとめる先のグループの要素数を更新

            this.Parents[x] += this.Parents[y];

            // まとめられるグループのルートの親を書き換え

            this.Parents[y] = x;

            return true;

        }

    }


}


Measured memory_bytes: 13368