#include <list>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <time.h>
#include <sstream>
#include <stdlib.h>
using namespace std;

// initializes the kernel for base

using sint=long unsigned int; // std::vector<std::__cxx11::basic_string<char> >::size_type;
list <string> found; vector <sint> fact; 
char tr[128]; int w[128];unsigned short int b;

ofstream kern; 

void buildfact()
 {unsigned int kk,n; bool ok;
  fact.push_back(2);fact.push_back(3);fact.push_back(5);
  for(n=7;n<b*b*b;n++)
   {ok=true;for(kk=0;fact[kk]*fact[kk]<=n;kk++)if(n%fact[kk]==0){ok=false;break;}
    if(ok)fact.push_back(n);
   }
 }

bool ok(sint n) // is prime?
 {unsigned int kk;
 if (n<2) return false;
 for (kk=0;fact[kk]*fact[kk]<=n;kk++)
     {if(n % fact[kk]==0)return  false;}
 return true;
 }

bool cover(string  el1,string el2) 
// checks if el1 is a substring of el2
 {sint i,j; 
  if(el1==el2)return true;
  if(el1.length()>=el2.length())return false;
  i=0;j=0;
  while(i<el1.length())
  {if(el1[i]==el2[j])
     {i++;j++;if(i>=el1.length())return true;if(j>=el2.length())return false;}
   else{j++;if(j>=el2.length())return false;}
  }
  return true;
 }

bool smaller(string el1,string el2) 
// checks if el1 is smaller than el2 (assuming incomparability)
 {sint i;
  if(el1.length()<el2.length())return true;
  if(el1.length()>el2.length())return(false);
  i=0;
  while(i<el1.length())
       {if(el1[i]==el2[i])i++; else return(w[el1[i]]<w[el2[i]]);}
  return false;
 }

int main(int argc, char *argv[])
{string p,ms,pref,prefms; sint i,j;
list<string>::iterator it;
ms=argv[1];b=atoi(argv[1]);buildfact();
pref="kernel"; prefms=pref+ms;
kern.open(prefms.c_str(),std::ofstream::out | std::ofstream::trunc);
for(char c='0';c<='9';c++){w[c]=0+c-'0';tr[0+c-'0']=c;}
for(char c='A';c<='Z';c++){w[c]=10+c-'A';tr[10+c-'A']=c;}
for(char c='a';c<='z';c++){w[c]=36+c-'a';tr[36+c-'a']=c;}
for(i=b+1;i<b*b*b*b*b;i++)if(ok(i))
   {j=i;p="";while(j>0){p=tr[j%b]+p;j=j/b;};
    for(it=found.begin();it!=found.end();it++){if(cover((*it),p))break;} // p is covered
    if(it!=found.end())continue;
    found.push_back(p);
   }
for(it=found.begin();it!=found.end();it++)kern<<(*it)<<"\n";
kern.close();
} // end main