#include using namespace std; typedef long long int ll; typedef double ld; typedef pair ii; typedef vector vi; typedef vector vii; #define PB push_back #define FOR(prom, a, b) for ( ll prom = (a); prom < (ll)(b); ++prom ) #define F(a) FOR(i,0,a) #define FF(a) FOR(j,0,a) #define EPS (1e-10) struct Tree { ll S, X, Y; }; ll M, N; bool isPrintable ( const Tree & t ) { if ( -1 <= t.X && t.X <= M ) { if ( t.S == 0 ) { return 0 <= t.Y && t.Y < M; } else { return 0 <= t.Y + t.S + 1 && t.Y < M; } } else { return false; } } int main () { ios::sync_with_stdio(false); while ( cin >> M >> N ) { vector TREES(N); F(N) cin >> TREES[ i ].S >> TREES[ i ].X >> TREES[ i ].Y; /* sort( TREES.begin(), TREES.end(), []( const Tree & x, const Tree & y ) { return x } ); //*/ vector> OUTPUT( M, vector( M, '.' ) ); F(N) if ( isPrintable( TREES[ i ] ) ) { const Tree & t = TREES[ i ]; if ( t.S == 0 ) { // parez if ( 0 <= t.X - 1 && t.X - 1 < M ) OUTPUT[ t.X - 1 ][ t.Y ] = '_'; if ( 0 <= t.X && t.X < M ) OUTPUT[ t.X ][ t.Y ] = 'o'; if ( 0 <= t.X + 1 && t.X + 1 < M ) OUTPUT[ t.X + 1 ][ t.Y ] = '_'; } else { // strom // koren if ( 0 <= t.Y && t.Y < M ) { if ( 0 <= t.X - 1 && t.X - 1 < M ) OUTPUT[ t.X - 1 ][ t.Y ] = '_'; if ( 0 <= t.X && t.X < M ) OUTPUT[ t.X ][ t.Y ] = '|'; if ( 0 <= t.X + 1 && t.X + 1 < M ) OUTPUT[ t.X + 1 ][ t.Y ] = '_'; } // trunk //* ll lower = ( t.Y + 1 < 0LL ) ? 0LL : ( t.Y + 1 ); ll upper = ( t.Y + t.S >= M - 1 ) ? ( M - 1 ) : ( t.Y + t.S ); for ( ll d = lower; d <= upper;++d ) { if ( 0 <= t.X - 1 && t.X - 1 < M ) OUTPUT[ t.X - 1 ][ d ] = '/'; if ( 0 <= t.X && t.X < M ) OUTPUT[ t.X ][ d ] = '|'; if ( 0 <= t.X + 1 && t.X + 1 < M ) OUTPUT[ t.X + 1 ][ d ] = '\\'; }//*/ // spicka if ( 0 <= t.Y + t.S + 1 && t.Y + t.S + 1 < M && 0 <= t.X && t.X < M ) OUTPUT[ t.X ][ t.Y + t.S + 1 ] = '^'; } } F(M+2) cout << "*"; cout << endl; F(M) { cout << "*"; FF(M) cout << OUTPUT[ j ][ M - 1 - i ]; cout << "*" << endl; } F(M+2) cout << "*"; cout << endl << endl; } return 0; }