using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("7");
            WillReturn.Add("3 6");
            WillReturn.Add("1 2");
            WillReturn.Add("3 1");
            WillReturn.Add("7 4");
            WillReturn.Add("5 7");
            WillReturn.Add("1 4");
            //Fennec
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("4");
            WillReturn.Add("1 4");
            WillReturn.Add("4 2");
            WillReturn.Add("2 3");
            //Snuke
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static int N;

    //移動先のList[移動元]で辺を表現
    static Dictionary<int, List<int>> EdgeDict = new Dictionary<int, List<int>>();

    static void Main()
    {
        List<string> InputList = GetInputList();
        N = int.Parse(InputList[0]);

        foreach (string EachStr in InputList.Skip(1)) {
            int[] wkArr = EachStr.Split(' ').Select(X => int.Parse(X)).ToArray();

            if (EdgeDict.ContainsKey(wkArr[0]) == false) {
                EdgeDict.Add(wkArr[0], new List<int>());
            }
            EdgeDict[wkArr[0]].Add(wkArr[1]);

            if (EdgeDict.ContainsKey(wkArr[1]) == false) {
                EdgeDict.Add(wkArr[1], new List<int>());
            }
            EdgeDict[wkArr[1]].Add(wkArr[0]);
        }
        int[] KyoriArr1 = DeriveKyori(1);
        int[] KyoriArr2 = DeriveKyori(N);

        //for (int I = 1; I <= KyoriArr1.GetUpperBound(0); I++) {
        //    Console.WriteLine("KyoriArr1[{0}]={1}", I, KyoriArr1[I]);
        //}

        int Node1Cnt = 0;
        int Node2Cnt = 0;
        for (int I = 1; I <= N; I++) {
            if (KyoriArr1[I] <= KyoriArr2[I]) Node1Cnt++;
            else Node2Cnt++;
        }
        Console.WriteLine(Node1Cnt > Node2Cnt ? "Fennec" : "Snuke");
    }

    struct JyoutaiDef
    {
        internal int CurrNode;
        internal int Level;
    }

    //始点のノードを引数として、各ノードまでの距離を返す
    static int[] DeriveKyori(int pNode)
    {
        int[] KyoriArr = new int[N + 1];

        var Que = new Queue<JyoutaiDef>();
        JyoutaiDef WillEnqueue;
        WillEnqueue.CurrNode = pNode;
        WillEnqueue.Level = 0;

        Que.Enqueue(WillEnqueue);
        var VisitedSet = new HashSet<int>();

        while (Que.Count > 0) {
            JyoutaiDef Dequeued = Que.Dequeue();

            if (VisitedSet.Add(Dequeued.CurrNode) == false) continue;
            KyoriArr[Dequeued.CurrNode] = Dequeued.Level;

            if (EdgeDict.ContainsKey(Dequeued.CurrNode)) {
                foreach (int EachNode in EdgeDict[Dequeued.CurrNode]) {
                    WillEnqueue.CurrNode = EachNode;
                    WillEnqueue.Level = Dequeued.Level + 1;
                    Que.Enqueue(WillEnqueue);
                }
            }
        }
        return KyoriArr;
    }
}


Measured memory_bytes: 51168