#include<bits/stdc++.h>
#define mp make_pair
#define ll long long
#define all(v) v.begin(),v.end()
using namespace std;
namespace data{
	const int INF=2147483647;
	const int Inf=0x3f3f3f3f;
	const double PI=3.1415926535897932384626;
}
namespace mypii{
	struct PII{
		int first,second;
		PII(){}
		PII(int f, int s): first(f),second(s){}
		inline bool operator <(const PII& x)const{
			if(first!=x.first) return first<x.first;
			return second<x.second;
		}
		inline bool operator ==(const PII& x)const{
			return first==x.first and second==x.second;
		}
		inline bool operator >(const PII& x)const{
			if(first!=x.first) return first>x.first;
			return second>x.second;
		}
		inline bool operator !=(const PII& x)const{
			return first!=x.first and second!=x.second;
		}
	};
}

namespace make_data{
	ofstream out;
	ifstream in;
	inline string itos(int x){
		string rt="";
		while(x) rt=(char)(x%10+'0')+rt,x/=10;
		return rt;
	}
	class My_io_s{
		public:
		void openoi(int x){out.open(("T_"+itos(x)+".in").c_str());}
		void openoo(int x){out.open(("T_"+itos(x)+".out").c_str());}
		void openii(int x){in.open(("T_"+itos(x)+".in").c_str());}
		void openio(int x){in.open(("T_"+itos(x)+".out").c_str());}
		void open1(int x){openoi(x);}
		void open2(int x){openii(x);openoo(x);}
		void closei(){in.close();}
		void closeo(){out.close();}
		void close(){closei();closeo();}
		void oii(int a,int b){out<<a<<' '<<b<<endl;}
		void oi_(int x){out<<x<<' ';}
		void oip(int x){out<<x<<endl;}
	}My;
}
namespace runtime{
	clock_t __stt;
	inline void TStart(){__stt=clock();}
	inline void TReport(){printf("\nTaken Time : %.3lf sec\n",(double)(clock()-__stt)/CLOCKS_PER_SEC);}
}
namespace quickread{
	inline void rdl(long long &val){
	    long long x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    val=x*f;
	}
	inline void rdi(int &val){
	    int x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    val=x*f;
	}
	inline long long rdl(){
	    long long x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    return x*f;
	}
	inline int rdi(){
	    int x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    return x*f;
	}
	inline void write(int x){
	    if(x<0) putchar('-'),x=-x;
	    if(x>9) write(x/10);
	    putchar(x%10+'0');
	}
	inline void _write(int x){
		write(x);
		putchar(' ');
	}
	inline void print(int x){
		write(x);
		putchar('\n');
	}
	inline void write(ll x){
	    if(x<0) putchar('-'),x=-x;
	    if(x>9) write(x/10);
	    putchar(x%10+'0');
	}
	inline void _write(ll x){
		write(x);
		putchar(' ');
	}
	inline void print(ll x){
		write(x);
		putchar('\n');
	}
}
namespace dsu{
	int par[200200];
	inline void init(int _n){for(int i=0;i<_n;++i) par[i]=i;}
	inline int find(int now){
		if(par[now]==now) return now;
		return par[now]=find(par[now]);
	}
	inline bool unite(int a, int b){
		int Pa(find(a)),Pb(find(b));
		if(Pa==Pb) return false;
		par[Pa]=Pb;
		return true;
	}
}
using namespace quickread;
using namespace dsu;
using namespace mypii;
using namespace make_data;
using namespace runtime;
using namespace data;
namespace Max_Segment_Tree{
	const int mAxn=3e5+5;
	struct M_Sgt{
		int mx[mAxn<<3],lazy[mAxn<<3];
		inline void modify(int x,int l,int r,int L,int R,int d){
			if(L<=l and r<=R){
				mx[x]+=d;
				lazy[x]+=d;
				return;
			}
			int md=l+r>>1;
			if(L<=md)modify(x<<1,l,md,L,R,d);
			if(md<R)modify(x<<1|1,md+1,r,L,R,d);
			mx[x]=max(mx[x<<1],mx[x<<1|1])+lazy[x];
		}
		inline void init(){
			memset(lazy,0,sizeof(lazy));
			memset(mx,-0x3f,sizeof(mx));
		}
	};
}
using namespace Max_Segment_Tree;
const int maxn=1000;
char buffer[maxn],*S,*T;
inline char Get_Char(){
    if(S==T){
        T=(S=buffer)+fread(buffer,1,maxn,stdin);
        if(S==T)return EOF;
    }
    return *S++;
}

inline int read(){
    char c;
    int re=0,f=0;
    for(c=Get_Char();c<'0' or c>'9';c=Get_Char())if(c=='-')f=1;
    for(;c>='0' and c<='9';)re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
    if(f)return -re;
    return re;
}

inline void read(int&x){
    char c;
    int re=0,f=0;
    for(c=Get_Char();c<'0' or c>'9';c=Get_Char())if(c=='-')f=1;
    for(;c>='0' and c<='9';)re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
    if(f)x=-re;
    else x=re;
}
int a[]={1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51};
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int k;cin>>k;
	cout<<a[k-1]<<'\n';
}


Measured memory_bytes: 256