#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=1e3+5;
int32_t n,ans,min=INT_MAX,limx,limy,vis[N][N];
char mp[N][N];
struct node {
int32_t l,r,h;
bool operator<(const node& b)const {
if(l==b.l) {
if(r==b.r) {
return h<b.h;
}
return r<b.r;
}
return l<b.l;
}
}a[10005];
signed main() {
std::cin>>n;
rep(i,1,n) {
std::cin>>a[i].l>>a[i].r>>a[i].h;
a[i].r--;
min=std::min(min,a[i].l);
limx=std::max(limx,a[i].r);
limy=std::max(limy,a[i].h);
}
rep(i,0,limy+1) {
rep(j,0,limx+1) {
if(i==0) {
mp[i][j]='*';
} else {
mp[i][j]='.';
}
}
}
rep(i,1,n) {
rep(j,1,a[i].h) {
mp[j][a[i].l]=mp[j][a[i].r]='#';
}
rep(j,a[i].l,a[i].r) {
mp[a[i].h][j]='#';
}
int x1=1,x2=a[i].h-1,y1=a[i].l+1,y2=a[i].r-1;
vis[x1][y1]++;
vis[x1][y2+1]--;
vis[x2+1][y1]--;
vis[x2+1][y2+1]++;
}
rep(i,1,limy) {
rep(j,1,limx) {
vis[i][j]+=vis[i-1][j]+vis[i][j-1]-vis[i-1][j-1];
}
}
dep(i,limy,0) {
rep(j,1,limx) {
if(mp[i][j]=='#'&&vis[i][j]>0) {
mp[i][j]='.';
}
}
}
rep(i,1,limy+1) {
rep(j,0,limx+1) {
if(mp[i][j]=='#') {
if(mp[i][j-1]=='.'&&!vis[i][j-1]){
ans++;
}
if(mp[i][j+1]=='.'&&!vis[i][j+1]){
ans++;
}
if(mp[i-1][j]=='.'&&!vis[i-1][j]){
ans++;
}
if(mp[i+1][j]=='.'&&!vis[i+1][j]){
ans++;
}
}
}
}
std::cout<<ans<<'\n';
dep(i,limy,0) {
rep(j,min,limx) {
std::cout<<mp[i][j];
}
puts("");
}
return 0;
}