// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#undef _GLIBCXX_DEBUG



template <typename A, typename B>

string to_string(pair<A, B> p);



template <typename A, typename B, typename C>

string to_string(tuple<A, B, C> p);



template <typename A, typename B, typename C, typename D>

string to_string(tuple<A, B, C, D> p);



string to_string(const string& s) {

	return '"' + s + '"';

}



string to_string(const char* s) {

	return to_string((string) s);

}



string to_string(bool b) {

	return (b ? "true": "false");

}



string to_string(vector<bool> v) {

	bool first = true;

	string res = "{";

	for (int i = 0; i < static_cast<int>(v.size()); i++) {

		if (!first) {

			res += ", ";

		}

		first = false;

		res += to_string(v[i]);

	}

	res += "}";

	return res;

}



template <size_t N>

string to_string(bitset<N> v) {

	string res = "";

	for (size_t i = 0; i < N; i++) {

		res += static_cast<char>('0' + v[i]);

	}

	return res;

}



template <typename A>

string to_string(A v) {

	bool first = true;

	string res = "{";

	for (const auto &x : v) {

		if (!first) {

			res += ", ";

		}

		first = false;

		res += to_string(x);

	}

	res += "}";

	return res;

}



template <typename A, typename B>

string to_string(pair<A, B> p) {

	return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";

}



template <typename A, typename B, typename C>

string to_string(tuple<A, B, C> p) {

	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";

}



template <typename A, typename B, typename C, typename D>

string to_string(tuple<A, B, C, D> p) {

	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";

}



void debug_out() { cerr << "\033[33;0m" << endl; }



template <typename Head, typename... Tail>

void debug_out(Head H, Tail... T) {

	cerr << " " << to_string(H);

	debug_out(T...);

}



template <typename T>

void debug_out (T a[], int n) {

	cerr << "{" << to_string(a[0]);

	for (int i = 1; i < n; ++i) cerr << ", " << to_string(a[i]);

	cerr << "}";

	debug_out();

}



#define LOCAL



#ifdef LOCAL

#define dbg(...)  cerr << "\033[33;1m" << "[" << #__VA_ARGS__ << "] : ", debug_out(__VA_ARGS__)

#else

#define dbg(...) 42

#endif



using LL = long long;

using PII = pair<int,int>;

mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());



#define fi first

#define se second

#define mp make_pair

#define pb emplace_back

#define all(x) (x).begin(), (x).end()

#define SZ(x) ((int)(x.size()))

#define sqr(x) ((x)*(x))



LL powmod (LL a, LL b, LL MOD) {

	LL ans = 1;

	while (b) {

		if (b & 1) ans = ans * a % MOD;

		b >>= 1;

		a = a * a % MOD;

	}

	return ans % MOD;

}

const int N = 100005, MOD = 1e9+7, INF = 1e9;



// head



//your code goes there



int a, b;

int ma[105][105];

void init () {

	cin >> a >> b;

}

bool vis[105][105];

const int dx[] = {1,-1,0,0};

const int dy[] = {0,0,1,-1};

void work () {

	bool ok = 0;

	if (a > b) swap (a, b), ok = 1;

	int t = ceil (1.0 * a / 50);

	int placeA = 1, placeB = 1;

	for (int i = 1; i <= 2*t; ++i) 

		for (int j = 1; j <= 100; ++j)

			ma[i][j] = 2;

	for (int i = 1; i <= 2*t; i+=2) {

		for (int j = 1; j <= 100; j += 2) {

			if (placeA+1 <= a) {

				++placeA;

				ma[i][j] = 1;

			}

			if (placeA == a) break;

		}

		if (placeA == a) break;

	}

	for (int i = 2*t+1; i <= 100; ++i)

		for (int j = 1; j <= 100; ++j)

			ma[i][j] = 1;

	for (int i = 2*t+2; i <= 100; i+=2) {

			for (int j = 1; j <= 100; j += 2) {

				if (placeB + 1 <= b) placeB++, ma[i][j] = 2;

				if (placeB == b) break;

			}

	}		

	int aa = 0, bb = 0;

	for (int i = 1;i <= 100; ++i) {

		for (int j = 1; j <= 100; ++j) {

			if (!vis[i][j]) {

				vis[i][j] = 1;

				queue <PII> q; q.push(mp(i,j));

				while (!q.empty()) {

					PII t = q.front(); q.pop();

					for (int k = 0; k < 4; ++k) {

						int tx = t.fi + dx[k];

						int ty = t.se + dy[k];

						if (vis[tx][ty] || tx < 1 || ty < 1 || tx > 100 || ty > 100 || ma[tx][ty]!=ma[i][j]) continue;

						q.push(mp(tx,ty));

						vis[tx][ty] = 1;

					}

				}

				if (ma[i][j] == 1) aa++; else bb++;

			}

		}

	}

	printf ("100 100\n");

	for (int i = 1; i <= 100; ++i) {

		for (int j = 1; j <= 100; ++j) {

			if (!ok) {

				if (ma[i][j] == 1) printf(".");

				else printf("#");

			} else {

				if (ma[i][j] == 1) printf("#");

				else printf(".");

			}

		}

		printf("\n");

	}



	dbg (aa, bb, a, b);

}

int main () {

	time_t tic = clock();

	int T = 1;

	//scanf("%d",&T);

	while (T--) {

		init ();

		work ();

	}

	time_t toc = clock();

	cerr << "execute time = " << (toc-tic) / CLOCKS_PER_SEC << "ms\n";

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.1822637381412637x):
/*g++ main.cpp -o main.out*/

/*./main.out*/



#include <map>

#include <set>

#include <list>

#include <cmath>

#include <ctime>

#include <deque>

#include <queue>

#include <stack>

#include <bitset>

#include <cctype>

#include <cstdio>

#include <string>

#include <vector>

#include <climits>

#include <cstdlib>

#include <cstring>

#include <fstream>

#include <iomanip>

#include <sstream>

#include <iostream>

#include <iterator>

#include <algorithm>

using namespace std;



#define LL long long

#define ll long long

#define LD long double

#define Mod 1000000007

#define L_Mod 17100000013



const double eps = 1e-9;

const int INF = 0x3f3f3f3f;

const double PI = 3.1415926535;



#define NO_TLE std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);



#define ree(a,n) memset(a,n,sizeof(a));



#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))

#define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))

#define red(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i))



int m[105][105];



int main()

{

    int a,b;

    cin>>a>>b;

    rer(i,51,100)rer(j,1,100)m[i][j]=1;

    a--,b--;



    for(int i=1; i<=50&&a>0; i+=2)

    {

        for(int j=1; j<=100; j+=2)

        {

            m[i][j]=1;

            a--;

            if(a<=0)

                break;

        }

        if(a<=0)

            break;

    }

    for(int i=52; i<=100&&b>0; i+=2)

    {

        for(int j=1; j<=100; j+=2)

        {

            m[i][j]=0;

            b--;

            if(b<=0)

                break;

        }

        if(b<=0)

            break;

    }

    cout<<100<<' '<<100<<endl;

    rer(i,1,100)

    {

        rer(j,1,100)

        {

            if(m[i][j]==1)cout<<'.';

            else cout<<'#';

        }

        cout<<endl;

    }

    return 0;

}























//