main = do
    [m,n] <- fmap (map read.words) getLine
    print $ powMod 1000000007 m n

powMod p m n = pm n
--    where pm 0 = trace "call 0" 1
--          pm 1 = trace "call 1" $ m `mod` p
--          pm a = let n1' = a `div` 2
--                     n2' = a - n1'
--                  in trace ("call " ++ show a) $ (powModList !! n1' * powModList !! n2') `mod` p
--          powModList = [pm x | x <- [0,1..]]
    where pm 0 = 1
          pm 1 = m `mod` p
          pm a = let n1' = a `div` 2
                     n2' = a - n1'
                  in (powModList !! n1' * powModList !! n2') `mod` p
          powModList = [pm x | x <- [0,1..]]

