output_description: If Fennec wins, print `Fennec`; if Snuke wins, print `Snuke`.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N
      a_1 b_1
      :
      a_{N-1} b_{N-1}
attempt: #!/usr/bin/env python3
  
  import sys
  
  # import time
  # import math
  # import numpy as np
  # import scipy.sparse.csgraph as cs            # csgraph_from_dense(ndarray, null_value=inf), bellman_ford(G, return_predecessors=True), dijkstra, floyd_warshall
  # import random                                # random, uniform, randint, randrange, shuffle, sample
  # import string                                # ascii_lowercase, ascii_uppercase, ascii_letters, digits, hexdigits
  # import re                                    # re.compile(pattern) => ptn obj; p.search(s), p.match(s), p.finditer(s) => match obj; p.sub(after, s)
  # from bisect import bisect_left, bisect_right # bisect_left(a, x, lo=0, hi=len(a)) returns i such that all(val<x for val in a[lo:i]) and all(val>-=x for val in a[i:hi]).
  from collections import (
      deque,
  )  # deque class. deque(L): dq.append(x), dq.appendleft(x), dq.pop(), dq.popleft(), dq.rotate()
  
  # from collections import defaultdict          # subclass of dict. defaultdict(facroty)
  # from collections import Counter              # subclass of dict. Counter(iter): c.elements(), c.most_common(n), c.subtract(iter)
  # from datetime import date, datetime          # date.today(), date(year,month,day) => date obj; datetime.now(), datetime(year,month,day,hour,second,microsecond) => datetime obj; subtraction => timedelta obj
  # from datetime.datetime import strptime       # strptime('2019/01/01 10:05:20', '%Y/%m/%d/ %H:%M:%S') returns datetime obj
  # from datetime import timedelta               # td.days, td.seconds, td.microseconds, td.total_seconds(). abs function is also available.
  # from copy import copy, deepcopy              # use deepcopy to copy multi-dimentional matrix without reference
  # from functools import reduce                 # reduce(f, iter[, init])
  # from functools import lru_cache              # @lrucache ...arguments of functions should be able to be keys of dict (e.g. list is not allowed)
  # from heapq import heapify, heappush, heappop # built-in list. heapify(L) changes list in-place to min-heap in O(n), heappush(heapL, x) and heappop(heapL) in O(lgn).
  # from heapq import nlargest, nsmallest        # nlargest(n, iter[, key]) returns k-largest-list in O(n+klgn).
  # from itertools import count, cycle, repeat   # count(start[,step]), cycle(iter), repeat(elm[,n])
  # from itertools import groupby                # [(k, list(g)) for k, g in groupby('000112')] returns [('0',['0','0','0']), ('1',['1','1']), ('2',['2'])]
  # from itertools import starmap                # starmap(pow, [[2,5], [3,2]]) returns [32, 9]
  # from itertools import product, permutations  # product(iter, repeat=n), permutations(iter[,r])
  # from itertools import combinations, combinations_with_replacement
  # from itertools import accumulate             # accumulate(iter[, f])
  # from operator import itemgetter              # itemgetter(1), itemgetter('key')
  # from fractions import gcd                    # for Python 3.4 (previous contest @AtCoder)
  
  
  def main():
      mod = 1000000007  # 10^9+7
      inf = float("inf")  # sys.float_info.max = 1.79...e+308
      # inf = 2 ** 64 - 1             # (for fast JIT compile in PyPy) 1.84...e+19
      sys.setrecursionlimit(10**6)  # 1000 -> 1000000
  
      def input():
          return sys.stdin.readline().rstrip()
  
      def ii():
          return int(input())
  
      def mi():
          return map(int, input().split())
  
      def mi_0():
          return map(lambda x: int(x) - 1, input().split())
  
      def lmi():
          return list(map(int, input().split()))
  
      def lmi_0():
          return list(map(lambda x: int(x) - 1, input().split()))
  
      def li():
          return list(input())
  
      def restore_path(seq, start, goal):
          buf = []
          current = goal
          while current != start:
              buf.append(current)
              current = seq[current]
          buf.append(start)
          buf.reverse()
          return buf
  
      def calc_dist_path_in_bfs(adj, start, goal):
          q = deque()
          q.append([[start, None], 0])
          prev_memo = [None] * n
          while q:
              (u, prev), dist = q.popleft()
              if u == goal:
                  prev_memo[u] = prev
                  return dist, restore_path(prev_memo, start, goal)
              if not visited[u]:
                  visited[u] = True
                  prev_memo[u] = prev
                  for v in adj[u]:
                      if not visited[v]:
                          q.append([[v, u], dist + 1])
  
      def calc_node_in_dfs(adj, start):
          cnt = 1
          stack = [start]
          visited[start] = True
          while stack:
              # print(stack)
              u = stack[-1]
              for v in adj[u]:
                  if not visited[v]:
                      stack.append(v)
                      visited[v] = True
                      cnt += 1
                      break
              else:
                  stack.pop()
          return cnt
  
      n = ii()
      adj = [[] for _ in range(n)]
      for _ in range(n - 1):
          a, b = mi_0()
          adj[a].append(b)
          adj[b].append(a)
  
      visited = [False] * n
      dist, path = calc_dist_path_in_bfs(adj, start=0, goal=n - 1)
      # print(dist)
      # print(path)
  
      visited = [False] * n
      if dist % 2 == 1:
          i = path[(dist - 1) // 2]
          j = path[(dist - 1) // 2 + 1]
          adj[i].remove(j)
          adj[j].remove(i)
          # i 彩色数 > j 彩色数 で Fennec 勝ち
          i_color = calc_node_in_dfs(adj, i)
          j_color = calc_node_in_dfs(adj, j)
          print("Fennec") if i_color > j_color else print("Snuke")
      else:
          i = path[dist // 2]
          j = path[dist // 2 + 1]
          adj[i].remove(j)
          adj[j].remove(i)
          # i 彩色数 >= j 彩色数 で Fennec 勝ち
          i_color = calc_node_in_dfs(adj, i)
          j_color = calc_node_in_dfs(adj, j)
          print("Fennec") if i_color >= j_color else print("Snuke")
  
  
  if __name__ == "__main__":
      main()
  
problem_description: Statement
  
  Fennec and Snuke are playing a board game.
  
  On the board, there are N cells numbered 1 through N, and N-1 roads, each
  connecting two cells. Cell a_i is adjacent to Cell b_i through the i-th road.
  Every cell can be reached from every other cell by repeatedly traveling to an
  adjacent cell. In terms of graph theory, the graph formed by the cells and the
  roads is a tree.
  
  Initially, Cell 1 is painted black, and Cell N is painted white. The other
  cells are not yet colored. Fennec (who goes first) and Snuke (who goes second)
  alternately paint an uncolored cell. More specifically, each player performs
  the following action in her/his turn:
  
    * Fennec: selects an uncolored cell that is adjacent to a **black** cell, and paints it **black**.
    * Snuke: selects an uncolored cell that is adjacent to a **white** cell, and paints it **white**.
  
  A player loses when she/he cannot paint a cell. Determine the winner of the
  game when Fennec and Snuke play optimally.
samples: [{"input": "7\n    3 6\n    1 2\n    3 1\n    7 4\n    5 7\n    1 4", "output": "Fennec\n    \n\nFor example, if Fennec first paints Cell 2 black, she will win regardless of\nSnuke's moves.\n\n* * *"}, {"input": "4\n    1 4\n    4 2\n    2 3", "output": "Snuke"}]