#include <iostream>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <tuple>
#include <algorithm>
#include <functional>
#include <cstring>
#include <limits.h>
#define FOR(i,k,n)  for (int i=(k); i<(int)(n); ++i)
#define REP(i,n)    FOR(i,0,n)
#define FORIT(i,c)	for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define SZ(i) ((int)i.size())
#define pb          push_back
#define mp          make_pair
#define mt          make_tuple
#define get0(x)     (get<0>(x))
#define get1(x)     (get<1>(x))
#define get2(x)     (get<2>(x))
#define ALL(X)      (X).begin(),(X).end()
#define LLMAX       9223372036854775807LL
#define LLMIN       -9223372036854775808LL
#define IMAX        2147483647
#define IMIN        -2147483648
typedef long long LL;
using namespace std;

int N;
vector<int> G[1000000];
int fn[1000000],sn[1000000];

int nNode(int v,int p){
    int r=1;
    REP(i,SZ(G[v])){
        if(G[v][i]==p)
            continue;
        r+=nNode(G[v][i],v);
    }
    return r;
}

int fDFS(int v,int p,int k){
    // printf("fDFS v=%d p=%d k=%d\n",v,p,k);
    REP(i,SZ(G[v])){
        if(G[v][i]==p)
            continue;
        k=fDFS(G[v][i],v,k)+1;
    }
    fn[v]=k;
    return k;
}

int sDFS(int v,int p,int k){
    REP(i,SZ(G[v])){
        if(G[v][i]==p)
            continue;
        k=sDFS(G[v][i],v,k)+1;
    }
    sn[v]=k;
    return k;
}

int color[1000000];

int main(void){
    cin>>N;
    REP(i,N-1){
        int a,b;
        cin>>a>>b;
        a--;b--;
        G[a].pb(b);
        G[b].pb(a);
        // printf("a=%d b=%d\n",a,b);
    }
    fDFS(0,N,0);
    sDFS(N-1,N,0);

    priority_queue<pair<int,int> > fq,sq;
    memset(color,-1,sizeof(color));
    fq.push(mp(sn[0],0));
    sq.push(mp(fn[N-1],N-1));
    while(1){
        int score,v;
        while(!fq.empty()&&color[fq.top().second]!=-1)
            fq.pop();
        if(fq.empty()){
            cout<<"Snuke"<<endl;
            return 0;
        }
        score=fq.top().first;
        v=fq.top().second;
        // printf("F %d\n",v);
        color[v]=1;
        fq.pop();
        REP(i,SZ(G[v]))
            if(color[G[v][i]]==-1)
                fq.push(mp(sn[G[v][i]],G[v][i]));

        while(!sq.empty()&&color[sq.top().second]!=-1)
            sq.pop();
        if(sq.empty()){
            cout<<"Fennec"<<endl;
            return 0;
        }
        score=sq.top().first;
        v=sq.top().second;
        // printf("S %d\n",v);
        color[v]=0;
        sq.pop();
        REP(i,SZ(G[v]))
            if(color[G[v][i]]==-1)
                sq.push(mp(fn[G[v][i]],G[v][i]));
    }


    // int f=0,s=0;
    // REP(i,SZ(G[0]))
    //     if(sn[0]<sn[G[0][i]])
    //         f=nNode(0,G[0][i]);
    // REP(i,SZ(G[N-1]))
    //     if(fn[N-1]<fn[G[N-1][i]])
    //         s=nNode(N-1,G[N-1][i]);
    // // printf("f=%d s=%d\n",f,s);
    // f+=(N-f-s+1)/2;
    // //
    // // REP(i,N)
    // //     printf("fn[%d]=%d\n",i,fn[i]);
    // // printf("\n");
    // // REP(i,N)
    // //     printf("sn[%d]=%d\n",i,sn[i]);
    //
    // if(f>N-f)
    //     cout<<"Fennec"<<endl;
    // else
    //     cout<<"Snuke"<<endl;
    //  return 0;
}

Measured memory_bytes: 44800