import Control.Monad
import qualified Data.ByteString.Char8 as C
import Data.List
import Data.Maybe
import qualified Data.Set as S
import Data.Vector.Generic ((!))
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as UM

main = C.interact $ put . sol . get

get = U.unfoldr (C.readInt . C.dropWhile (<'0'))

put = C.pack

sol v = if cnt>0 then "Fennec" else "Snuke"
  where
  n = U.head v
  u = U.tail v
  tree = build n $ U.unfoldrN (n-1) split2 u
  split2 u = Just ((U.head v,U.last v), w) where (v,w) = U.splitAt 2 u
  d1 = levels n tree 1
  dn = levels n tree n
  cnt = foldl' (\s i -> if d1!i <= dn!i then s+1 else s-1) 0 [1..n]

build :: Int -> U.Vector (Int, Int) -> V.Vector (U.Vector Int)
build n es = V.create $ do
  v <- VM.replicate (n+1) U.empty
  let add a b = VM.read v a >>= VM.write v a . (U.cons b) 
  U.forM_ es $ \(a,b) -> do
    add a b
    add b a
  return v

levels :: Int -> V.Vector (U.Vector Int) -> Int -> U.Vector Int
levels n tree v0 = U.create $ do
  d <- UM.replicate (n+1) maxBound
  UM.write d v0 0
  loop d $ S.singleton (0,v0)
  return d
  where
  loop d q = when (not $ S.null q) $ do
    let ((lvl,nd),q') = fromJust $ S.minView q
    U.foldM (f (lvl+1) d) q' (tree!nd) >>= loop d
  f l d q v = do
    l0 <- UM.read d v
    if l >= l0
      then return q
      else do
        UM.write d v l
        return . S.insert (l,v) $ S.delete (l0,v) q