#include <bits/stdc++.h>

#define X first
#define Y second
#define PB push_back
#define x first
#define y second
#define pb push_back

using namespace std;

typedef long long ll;
typedef vector<int> vi;

const int N=300010,MOD=1e9+7;
const char en='\n';
const ll LLINF=1ll<<60;

vector<string> trp(vector<string> a)
{
	int n=a.size(),m=a[0].size();
	vector<string> b(m,string(n,'.'));
	for (int i=0;i<n;++i) for (int j=0;j<m;++j) b[j][i]=a[i][j];
	return b;
}

vector<string> solve(ll k,ll n,ll m)
{
	assert(n>1 && m>1);
	if (k<=((n+1)/3)*((m+1)/3))
	{
		vector<string> v(n,string(m,'.'));
		for (int i=0;i<n-1;i+=3) for (int j=0;j<m-1;j+=3) if (k)
		{
			v[i][j]=v[i+1][j+1]=v[i+1][j]=v[i][j+1]='#';
			--k;
		}
		return v;
	}
	if (n>m) return trp(solve(k,m,n));
	if (k>=m*(m-1)/2)
	{
		ll u=k/(m*(m-1)/2);
		ll kol=2;
		while ((kol+1)*kol/2<=u) ++kol;
		assert(n>kol);
		vector<string> v=solve(k-(kol*(kol-1)/2)*(m*(m-1)/2),n-kol-1,m);
		v.pb(string(m,'.'));
		for (int i=0;i<kol;++i) v.pb(string(m,'#'));
		return v;
	}
	if (k>=n*(n-1)/2)
	{
		ll u=k/(n*(n-1)/2);
		ll kol=2;
		while ((kol+1)*kol/2<=u) ++kol;
		assert(m>kol);
		vector<string> v=solve(k-(kol*(kol-1)/2)*(n*(n-1)/2),n,m-kol-1);
		for (int i=0;i<n;++i)
		{
			v[i].pb('.');
			for (int j=0;j<kol;++j) v[i].pb('#');
		}
		return v;
	}
	vector<string> v=solve(k,n-1,m-1);
	for (int i=0;i<n-1;++i) v[i].pb('.');
	v.pb(string(m,'.'));
	return v;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	ll k;
	cin>>k;
	int n=2025,m=2025;
	vector<string> odg=solve(k,n,m);
	cout<<n<<' '<<m<<endl;
	for (auto x: odg) cout<<x<<en;
}