#include <cmath>
#include <iostream>
#include <sstream>

int
main( int argc, const char* const argv[] )
{
    unsigned int spokes = 6;
    bool fit = false;
    bool move = false;

    for ( int ii=1; ii < argc; ++ii ) {
	std::string arg( argv[ii] );

	if ( arg == "-n" ) {
	    if ( ii+1 < argc ) {
		std::istringstream argval( argv[ii+1] );
		argval >> spokes;
		if ( argval.bad() || spokes < 2 ) {
		    std::cerr << "Argument must be an integer greater than one"
			<< std::endl;
		    return __LINE__;
		}
	    }
	} else if ( arg == "-f" ) {
	    fit = true;
	} else if ( arg == "-m" ) {
	    move = true;
	}
    }

    double wedge = ( M_PI * 2.0 / (double)spokes );
    double offset = ( wedge / 4.0 );

    std::cerr << ( 180.0 * wedge / M_PI ) << std::endl;

    unsigned int ww;
    unsigned int hh;
    unsigned int vv;
    unsigned char dummy;

    std::cin >> dummy >> dummy;
    std::cin >> ww >> hh >> vv >> std::noskipws >> dummy;

    unsigned char* buf = new unsigned char[ ww * 2 * 3 ];
    unsigned char* scaled = new unsigned char[ ( ww / 2 ) * ( hh / 2 ) * 3 ];

    for ( unsigned int jj=0; jj < hh; ++jj ) {
	std::cin.read( (char*)&buf[ ( jj & 1 ) * ww * 3 ], ww * 3 );
	if ( ( jj & 1 ) == 1 ) {
	    for ( unsigned int ii=0; ii < (ww/2); ++ii ) {
		for ( unsigned int kk=0; kk < 3; ++kk ) {
		    vv  = buf[ kk + ( ii*2 + 0 + ww * 0 ) * 3 ];
		    vv += buf[ kk + ( ii*2 + 1 + ww * 0 ) * 3 ];
		    vv += buf[ kk + ( ii*2 + 0 + ww * 1 ) * 3 ];
		    vv += buf[ kk + ( ii*2 + 1 + ww * 1 ) * 3 ];
		    scaled[ kk + ( ii + (jj/2) * (ww/2) ) * 3 ]
			= (unsigned char)( vv / 4 );
		}
	    }
	}
    }

    unsigned int wp = (ww/2)*2;
    unsigned int hp = (hh/2)*2;

    std::cout << "P6" << std::endl;
    std::cout << wp << " " << hp << std::endl;
    std::cout << "255" << std::endl;

    double rr = std::sqrt( wp * wp + hp * hp ) / 2.0;

    for ( unsigned int jj=0; jj < hp; ++jj ) {
	int yy = (int)jj - (int)(hp/2);

	if ( move ) {
	    if ( yy < 0 ) {
		yy += (hp/2);
	    } else {
		yy -= (hp/2);
	    }
	}

	for ( unsigned int ii=0; ii < wp; ++ii ) {
	    int xx = (int)ii - (int)(wp/2);

	    if ( move ) {
		if ( xx < 0 ) {
		    xx += (wp/2);
		} else {
		    xx -= (wp/2);
		}
	    }

	    double angle = std::atan2( (double)yy, (double)xx ) - M_PI_4;
	    double radius = std::sqrt( (double)( xx * xx + yy * yy ) );

	    if ( fit ) {
		radius *= M_SQRT2;
	    }

	    int aa = (int)( angle / wedge );
	    double bb = ( - aa * wedge + angle );
	    if ( bb < 0.0 ) {
		bb += wedge;
	    }

	    if ( bb > offset ) {
		if ( bb > offset * 3.0 ) {
		    bb -= wedge;
		} else {
		    bb = ( -bb + offset * 2.0 );
		}
	    }

	    unsigned int xp = (unsigned int)( radius * std::cos( bb+M_PI_4 ) - 0.5 );
	    unsigned int yp = (unsigned int)( radius * std::sin( bb+M_PI_4 ) - 0.5 );

	    if ( xp >= (ww/2) || yp >= (hh/2) ) {
		buf[ ii * 3 + 0 ] = 0;
		buf[ ii * 3 + 1 ] = 0;
		buf[ ii * 3 + 2 ] = 0;
	    } else {
		unsigned int dd = ( xp + yp * ww/2 ) * 3;
		buf[ ii * 3 + 0 ] = scaled[ dd + 0 ];
		buf[ ii * 3 + 1 ] = scaled[ dd + 1 ];
		buf[ ii * 3 + 2 ] = scaled[ dd + 2 ];
	    }
	}

	std::cout.write( (const char*)buf, wp * 3 );
    }

    std::cout << std::flush;

    return 0;
}

