#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std ;

struct bignum {
    string num ;
    bignum () : num ("0") {}
    bignum  ( string s1 ) : num ( s1 ) {}
    void uredi () {
        while ( num [ 0 ] == '0' ) num.erase ( 0, 1 ) ;
        return;
    }
    bool operator < ( bignum broj ) {
        if ( num.size () > broj.num.size () ) return 0 ;
        if ( num.size () < broj.num.size () ) return 1 ;
        for ( int i = 0 ; i < num.size () ; ++i )
            if ( num [ i ]-'0'<broj.num [ i ]-'0' ) return 1 ;
        return 0 ;
    }
    bignum operator + ( bignum nes ) {
        bignum rez ("") ;
        int how_much = 0 ;
        while ( nes.num.size () > num.size () ) num = '0' + num ;
        while ( nes.num.size () < num.size () ) nes.num = '0' + nes.num ;
        for ( int i = num.size ()-1 ; i >= 0 ; --i ) {
            int sum = ( how_much + ( ( num [ i ]-'0' ) + ( nes.num [ i ]-'0' ) ) ) ;
            how_much = sum / 10 ;
            if ( sum >= 10 )sum -= 10 ;
            rez.num = char ( '0' + sum ) + rez.num ;
        }
        if ( how_much > 0 ) rez.num = char ( '0' + how_much ) + rez.num ;
        rez.uredi () ;
        return rez ;
    }
    bignum operator - ( bignum nes ) {
        bignum rez ;
        int how_much = 0 ;
        while ( nes.num.size () > num.size () ) num = '0' + num ;
        while ( nes.num.size () < num.size () ) nes.num = '0' + nes.num ;
        for ( int i = num.size ()-1 ; i >= 0 ; --i ) {
            int num1 = num [ i ]-'0', num2 = how_much + ( nes.num [ i ]-'0' ) ;
            if ( num1 < num2 ) {
                num1 += 10 ;
                how_much = 1 ;
            } else how_much = 0 ;
            rez.num = char ( '0'+( num1 - num2 ) ) + rez.num ;
        }
        rez.uredi () ;
        return rez ;
    }
    bignum operator * ( bignum nes ) {
        bignum rez ;
        int how_much = 0 ;
        bignum umn [ 100000 ] ;
        rez.num = "0" ;
        for ( int i = 0 ; i < nes.num.size () ; ++i ) {
            for ( int j = 0 ; j < i ; ++j ) umn [ j ].num += '0' ;
            how_much = 0 ;
            for ( int j = num.size ()-1 ; j >= 0 ; --j ) {
                int sum = how_much + ( nes.num [ i ]-'0')*( num [ j ]-'0') ;
                how_much = sum / 10 ;
                sum %= 10 ;
                umn [ i ].num = char ( '0' + sum ) + umn [ i ].num ;
            }
            umn [ i ].num = char ( '0' + how_much )+umn [ i ].num ;
        }
        for ( int i = 0 ; i < nes.num.size () ; ++i )
            rez = rez+umn [ i ] ;
        string b ;
        for ( int i = 0 ; i < rez.num.size ()-1 ; ++i )
            b = b+rez.num [ i ] ;
        return b ;
    }
} a ("1"), X, nekaj ;

int Y ;

bignum pot ( bignum br , int p ) {
    if ( p == 1 ) return br ;
    if ( p == 2 ) return br * br ;
    if ( p % 2 == 0 ) {
        bignum a = pot ( br , p / 2 ) ;
        return a*a ;
    }
    return pot ( br ,p - 1 ) * br ;
}

int main ( void ) {
    ios_base::sync_with_stdio ( false ) ;
    cin >> X.num ;
    cin >> Y ;
    if ( Y == 1 ) {
        cout << X.num << endl ;
        return 0 ;
    }
    for ( bignum i ("2") ; i < X ; i=i+a )
       if ( pot ( i.num, Y ).num == X.num ) {
           cout << i.num << endl ;
           return 0 ;
       }
    return 0 ;
}
