/*
//백준 28218
#include<stdio.h>
int n, m, k;
char map[305][305]={};
int result=100000;
int f(int x, int y, int cnt)
{
int i;
if(x==n-1&&y==m-1){
if(cnt<result){
result=cnt;
}
}
if(map[x+1][y]=='.'){
f(x+1, y, cnt+1);
}
if(map[x][y+1]=='.'){
f(x, y+1, cnt+1);
}
for(i=1; i<=k; i++){
if(map[x+i][y+i]=='.'){
f(x+i, y+i, cnt+1);
}
}
return result;
}
int main()
{
int i, q, x, y, a;
scanf("%d%d%d", &n, &m, &k);
for(i=0; i<n; i++){
scanf("%s", map[i]);
}
scanf("%d", &q);
for(i=0; i<q; i++){
scanf("%d%d", &x, &y);
a=f(x-1, y-1, 0);
if(a%2==1){
printf("First\n");
}
else{
printf("Second\n");
}
}
return 0;
}
//2601
#include<stdio.h>
int memo[1000]={};
int f(int n)
{
if(n<=2){
memo[n]=1;
return 1;
}
if(memo[n]==0){
memo[n]=f(n-1)+f(n-2);
}
return memo[n];
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", f(n));
}
*/
//2640
#include<stdio.h>
int n;
long long int f(int k)
{
if(k==1){
return n;
}
long long int b=f(k/2);
if(k%2==0){
return b*b%1000000007;
}
else{
return (b*b)%1000000007*n%1000000007;
}
}
int main()
{
int k;
scanf("%d%d", &n, &k);
printf("%lld", f(k));
return 0;
}
//코드업 DP 문제 다 풀기
//백준 DP 활용 문제 풀기(28218 필수!!)



