#include <bits/stdc++.h>
using namespace std;
 
using tpl = tuple<char, int>;
typedef pair<int,int> pii;
typedef long long ll;

void fastStream(){cin.tie(0);std::ios_base::sync_with_stdio(0);}

int A, B;
char field[110][110];
bool rev;

int main(){

    fastStream();
    cin >> A >> B;
    for(int i = 0; i < 100; i++)
        for(int j = 0; j < 100; j++)
            field[i][j] = '.';

    if(A > B){
        rev = true;
        swap(A,B);
    }

    A--;
    int cnt = 0;
    for(int j = 3; j < 99 && A > 0; j += 4){
        for(int i = 0; i < 100; i++){
            field[i][j] = '#';
        }
        B--;
        A--;
        cnt++;
    }

    if(A > 0){
        B += cnt;
        B--;
    }

    for(int i = 3; i < 99 && A > 0; i += 4){
        for(int j = 0; j < 100; j++){
            field[i][j] = '#';
        }
        A-=25;
    }

    //cout << A << endl;
    // 幅優先探索で塗って帳尻合わせ
    for(int i = 0; i < 100 && A < 0; i++){
        for(int j = 0; j < 100 && A < 0; j++){
            if(field[i][j] == '.'){
                queue<pii> q;
                q.push(pii(i, j));
                field[i][j] = '#';
                while(q.size()){
                    pii p = q.front(); q.pop();
                    int cy = p.first;
                    int cx = p.second;
                    const int dy[]={-1,0,0,1};
                    const int dx[]={0,-1,1,0};
                    for(int k = 0; k < 4; k++){
                        int ny = cy + dy[k];
                        int nx = cx + dx[k];
                        if(ny >= 0 && nx >= 0 && ny < 100 && nx < 100 && field[ny][nx] == '.'){
                            field[ny][nx] = '#';
                            q.push(pii(ny, nx));
                        }
                    }
                }
                A++;
            }
        }
    }
    
    for(int i = 0; i < 100; i++){
        for(int j = 0; j < 100; j++){
            if(B == 0)continue;
            if(field[i][j] == '#') continue;
            bool ok = true;
            for(int dy = -1; dy <= 1; dy++){
                for(int dx = -1; dx <= 1; dx++){
                    int ni = i + dy;
                    int nj = j + dx;
                    if(ni >= 0 && nj >= 0 && ni < 100 && nj < 100 && field[ni][nj] == '#'){
                        ok = false;
                    }
                }
            }

            if(ok){
                field[i][j] = '#';
                B--;
            }
        }
    }

    

    cout << 100 << " " << 100 << endl;
    for(int i = 0; i < 100; i++){
        for(int j = 0; j < 100; j++){
            if(rev){
                if(field[i][j] == '.'){
                    cout << "#";
                }
                else{
                    cout << ".";
                }
            }
            else{
                cout << field[i][j];
            }
        }
        cout << endl;
    }


    // int ans = 0;
    // for(int i = 0; i < 100; i++){
    //     for(int j = 0; j < 100; j++){
    //         if(field[i][j] == '.'){
    //             ans++;
    //             queue<pii> q;
    //             q.push(pii(i, j));
    //             field[i][j] = '#';
    //             while(q.size()){
    //                 pii p = q.front(); q.pop();
    //                 int cy = p.first;
    //                 int cx = p.second;
    //                 const int dy[]={-1,0,0,1};
    //                 const int dx[]={0,-1,1,0};
    //                 for(int k = 0; k < 4; k++){
    //                     int ny = cy + dy[k];
    //                     int nx = cx + dx[k];
    //                     if(ny >= 0 && nx >= 0 && ny < 100 && nx < 100 && field[ny][nx] == '.'){
    //                         field[ny][nx] = '#';
    //                         q.push(pii(ny, nx));
    //                     }
    //                 }
    //             }
    //             A++;
    //         }
    //     }
    // }



    return 0;
}


Measured memory_bytes: 256