unittest
{
//	assert( [ "5" ].parse.expand.solve == "3 5 7 11 31" );
//	assert( [ "6" ].parse.expand.solve == "2 3 5 7 11 13" );
//	assert( [ "8" ].parse.expand.solve == "2 5 7 13 19 37 67 79" );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	return tuple( n );
}

auto solve( long n )
{
	// 素数判定用素数列
	auto ps = primes( 1500 ).assumeSorted;
	
	// 5の倍数＋1の素数5つなら和が必ず5の倍数＋5（＝合成数）になる
	auto anss = new long[ n ];
	auto i = 0L;
	foreach( ref ans; anss )
	{
		do
		{
			i++;
		}
		while( ps.find( 5 * i + 1 ).empty );
		ans = 5 * i + 1;
	}
	return anss.to!( string[] ).join( " " );
}

// 素数列
auto primes( long x )
{
	Appender!( long[] ) ps;
	if( x < 2 ) return ps.data;
	
	auto cs = new bool[]( x + 1 );
	ps ~= 2L;
	for( auto i = 3L; i * i < cs.length; i += 2 )
	{
		if( cs[ i ] ) continue;
		for( auto j = i; i * j < cs.length; j++ )
		{
			cs[ i * j ] = true;
		}
	}
	for( auto i = 3L; i < cs.length; i += 2 )
	{
		if( !cs[ i ] ) ps ~= i;
	}
	return ps.data;
}
