N, X = list(map(int, input().split()))



t = 1

p = 2

while p * p <= X: # 2からルートxの範囲で素因数分解する

    e = 0

    while X % p == 0:

        X //= p

        e += 1  # 素数のカウント

    t *= p ** (e // N)

    p += 1

t *= X ** (1 // N) # 1または最初に与えられたX（素数）の1乗が残っているので、N個の数に次数を分配する



print(t)

def prime_decomposition(n) -> 'List[Tuple[prime,cnt]]':

    ret = []



    x = n



    divisor = 2

    cnt = 0

    while x % divisor == 0:

        x //= divisor

        cnt += 1

    if cnt > 0:

        ret.append((divisor, cnt))



    divisor = 3

    while divisor * divisor <= n:

        cnt = 0

        while x % divisor == 0:

            x //= divisor

            cnt += 1

        if cnt > 0:

            ret.append((divisor, cnt))

        divisor += 2



    if x > 1:

        ret.append((x, 1))



    return ret





n, p = list(map(int, input().split()))



lis = prime_decomposition(p)



ret = 1

for pr, cnt in lis:

    ret *= pr ** (cnt // n)

print(ret)



#     if cnt >= n:

#         ret *= pr

# ではなく、cnt//n

N, X = list(map(int, input().split()))
t = 1
p = 2
while p * p <= X:  # 2からルートxの範囲で素因数分解する
    e = 0
    while X % p == 0:
        X //= p
        e += 1  # 素数のカウント
    t *= p ** (e // N)
    p += 1
t *= X ** (1 // N)  # 1または最初に与えられたX（素数）の1乗が残っているので、N個の数に次数を分配する
print(t)

def prime_decomposition(n) -> "List[Tuple[prime,cnt]]":
    ret = []
    x = n
    divisor = 2
    cnt = 0
    while x % divisor == 0:
        x //= divisor
        cnt += 1
    if cnt > 0:
        ret.append((divisor, cnt))
    divisor = 3
    while divisor * divisor <= n:
        cnt = 0
        while x % divisor == 0:
            x //= divisor
            cnt += 1
        if cnt > 0:
            ret.append((divisor, cnt))
        divisor += 2
    if x > 1:
        ret.append((x, 1))
    return ret


n, p = list(map(int, input().split()))
lis = prime_decomposition(p)
ret = 1
for pr, cnt in lis:
    ret *= pr ** (cnt // n)
print(ret)
#     if cnt >= n:
#         ret *= pr
# ではなく、cnt//n

-N, X = list(map(int, input().split())) -t = 1 -p = 2 -while p * p <= X:  # 2からルートxの範囲で素因数分解する -    e = 0 -    while X % p == 0: -        X //= p -        e += 1  # 素数のカウント -    t *= p ** (e // N) -    p += 1 -t *= X ** (1 // N)  # 1または最初に与えられたX（素数）の1乗が残っているので、N個の数に次数を分配する -print(t) +def prime_decomposition(n) -> "List[Tuple[prime,cnt]]": +    ret = [] +    x = n +    divisor = 2 +    cnt = 0 +    while x % divisor == 0: +        x //= divisor +        cnt += 1 +    if cnt > 0: +        ret.append((divisor, cnt)) +    divisor = 3 +    while divisor * divisor <= n: +        cnt = 0 +        while x % divisor == 0: +            x //= divisor +            cnt += 1 +        if cnt > 0: +            ret.append((divisor, cnt)) +        divisor += 2 +    if x > 1: +        ret.append((x, 1)) +    return ret + + +n, p = list(map(int, input().split())) +lis = prime_decomposition(p) +ret = 1 +for pr, cnt in lis: +    ret *= pr ** (cnt // n) +print(ret) +#     if cnt >= n: +#         ret *= pr +# ではなく、cnt//n