// Original C++ solution (slower):
#include<algorithm>

#include<complex>

#include<ctype.h>

#include<iomanip>

#include<iostream>

#include<map>

#include<math.h>

#include<numeric>

#include<queue>

#include<set>

#include<stack>

#include<stdio.h>

#include<string>

#include<string>

#include<vector>



using namespace std;

typedef long long ll;



#define FOR(i,a,b) for(int i=(a);i<(b);++i)

#define ALL(v) (v).begin(), (v).end()

#define p(s) cout<<(s)<<endl

#define p2(s, t) cout << (s) << " " << (t) << endl

#define pn(s) cout << (#s) << " " << (s) << endl



const ll mod = 1e9 + 7;

const ll inf = 1e18;



string getLine(char c, int length){

    stringstream ss;

    FOR(i, 0, length){

        ss << c;

    }

    return ss.str();

}



vector<string> grid(100);



// 横に3つとびでドットを塗る

int paintDot(char color, int rowIndex, int maxInkNuM){

    int offset = 0;

    if(rowIndex % 2 == 1){

        offset = 2;

    }



    int i = 0;

    int paintNum = 0;

    while(i < 100 && maxInkNuM - paintNum > 0){

        grid[rowIndex][i+offset] = color;

        i+=4;

        paintNum++;

    }

    return paintNum;

}



void printGrid(){

    FOR(i, 0, 100){

        p(grid[i]);

    }

}



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);



    // input

    int A, B;

    cin >> A >> B;

    

    FOR(i, 0, 50){

        grid[i] = getLine('#', 100);

    }

    FOR(i, 50, 100){

        grid[i] = getLine('.', 100);

    }



    // paint by white

    int drawNum = A-1;

    int rowIndex = 0;

    while(drawNum>0){

        int drawnNum = paintDot('.', rowIndex, drawNum);

        drawNum -= drawnNum;

        rowIndex++;

    }



    // black

    drawNum = B-1;

    rowIndex = 51;

    while(drawNum>0){

        int drawnNum = paintDot('#', rowIndex, drawNum);

        drawNum -= drawnNum;

        rowIndex++;

    }



    p("100 100");

    printGrid();

    

    return 0;

}

// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;

using ll = long long;

using VI = vector<ll>;

using VV = vector<VI>;

using VS = vector<string>;



// tourist set

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 << '\n'; }



template <typename Head, typename... Tail>

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

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

  debug_out(T...);

}



#ifdef LOCAL

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

#else

#define debug(...) 42

#endif

// tourist set end



template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }



#define FOR(i,a,b) for(ll i=(a);i<(b);++i)

#define rep(i,b) FOR(i, 0, b)

#define ALL(v) (v).begin(), (v).end()

#define p(s) cout<<(s)<<'\n'

#define p2(s, t) cout << (s) << " " << (t) << '\n'

#define br() p("")

#define pn(s) cout << (#s) << " " << (s) << '\n'

#define p_yes() p("YES")

#define p_no() p("NO")

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



void no(){p_no(); exit(0);}

void yes(){p_yes(); exit(0);}



const ll mod = 1e9 + 7;

const ll inf = 1e18;



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);



    // input

    ll A, B; cin >> A >> B;



    const int W = 100;



    stringstream ss;

    rep(i, W) ss << '#';

    string sharp = ss.str();



    stringstream tt;

    rep(i, W) tt << '.';

    string dot = tt.str();



    VS M;    

    rep(i, W/2){

      M.push_back(sharp);

    }

    rep(i, W/2){

      M.push_back(dot);

    }



    // #の中に.を打っていく

    ll rest_dot = A - 1;

    ll rest_sharp = B - 1;



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

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

        if(rest_dot==0) goto HERE;

        M[i][j] = '.';

        rest_dot--;

      }

    }

HERE:



    for(int i=1+W/2; i<W; i+=2){

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

        if(rest_sharp==0) goto THERE;

        M[i][j] = '#';

        rest_sharp--;

      }

    }

THERE:





  p2(100, 100);

  for(string s : M){

    p(s);

  }

    

    return 0;

}

// Fastest known solution for this problem: