// Slower C++ solution:
/////////////////////////////////////////

////////// ^\/^ *_* :) :-D '~' \\\\\\\\\\

/////////////////////////////////////////

#include <bits/stdc++.h>

//#include <algorithm>

//#include <cstdio>

//#include <functional>

#include <iostream>

//#include <cfloat>

//#include <climits>

//#include <cstdlib>

//#include <cstring>

//#include <cmath>

//#include <map>

//#include <queue>

//#include <set>

//#include <sstream>

//#include <stack>

//#include <string>

//#include <time.h>

//#include <vector>

//#include <random>

//#include <unordered_set>

//#include <complex>

//#include <string.h>



#define rt0 return 0

#define rep(i,n) for(int i=0;i<n;i++)

#define repn(i,n) for(int i=1;i<=n;i++)

#define LL long long

#define pii pair<int,int>

#define pb push_back

#define fi first

#define se second

#define mpr make_pair



using namespace std;



const LL MOD=1e9+7;

int n,dist[100010],dist2[100010];

vector <int> g[100010];



int main()

{

	cin>>n;

	rep(i,n-1)

	{

		int x,y;

		cin>>x>>y;

		g[x].pb(y);

		g[y].pb(x);

	}

	memset(dist,1,sizeof(dist));

	memset(dist2,1,sizeof(dist2));

	queue <int> q;

	dist[1]=0;

	q.push(1);

	while(!q.empty())

	{

		int t=q.front();

		q.pop();

		rep(i,g[t].size())

		{

			if(dist[g[t][i]]!=16843009) continue;

			else

			{

				dist[g[t][i]]=dist[t]+1;

				q.push(g[t][i]);

			}

		}

	}

	queue <int> q1;

	dist2[n]=0;

	q1.push(n);

	while(!q1.empty())

	{

		int t=q1.front();

		q1.pop();

		rep(i,g[t].size())

		{

			if(dist2[g[t][i]]!=16843009) continue;

			else

			{

				dist2[g[t][i]]=dist2[t]+1;

				q1.push(g[t][i]);

			}

		}

	}

	int fen=0,snu=0;

	repn(i,n)

	{

		if(dist[i]<=dist2[i]) fen++;

		else snu++;

	}

	if(fen>snu) puts("Fennec");

	else puts("Snuke");

	rt0;

}

// Faster C++ solution for the same problem (measured speedup: 1.2284771524324951x):
#include<bits/stdc++.h>

using namespace std;

#define SZ(v) ((int)(v).size())

#define rep(i,n) for(int i=0;i<(n);i++)

#define foreach(it,c) for(__typeof(c.begin()) it=c.begin();it!=c.end();it++)

#define all(v) (v).begin(),(v).end()

typedef long long ll;

typedef unsigned uint;

const int INF=0x3f3f3f3f;

int inline in(){int x=0,c;for(;(uint)((c=getchar())-'0')>=10;)

{if(c=='-')return -in();if(!~c)throw ~0;}do{x=(x<<3)+(x<<1)+(c-'0');}

while((uint)((c=getchar())-'0')<10);return x;}

int n;

vector<int>G[100005];

int dist1[100005],dist2[100005];

void dfs1(int v,int p,int t){

	dist1[v]=t;

	rep(i,SZ(G[v])){

		int to=G[v][i];

		if(to!=p){

			dfs1(to,v,t+1);

		}

	}

}

void dfs2(int v,int p,int t){

	dist2[v]=t;

	rep(i,SZ(G[v])){

		int to=G[v][i];

		if(to!=p){

			dfs2(to,v,t+1);

		}

	}

}

int main(){

    cin.sync_with_stdio(false);cin.tie(0);

	cin>>n;

	rep(i,n-1){

		int u,v;

		cin>>u>>v;

		G[u].push_back(v);

		G[v].push_back(u);

	}

	dfs1(1,-1,0);

	dfs2(n,-1,0);

//	for(int i=1;i<=n;i++){

//		cout<<dist1[i]<<' ';

//	}

//	cout<<endl;

//	for(int i=1;i<=n;i++){

//		cout<<dist2[i]<<' ';

//	}

//	cout<<endl;

	int cnt1=0,cnt2=0;

	for(int i=1;i<=n;i++){

		if(dist1[i]<=dist2[i])cnt1++;

		else cnt2++;

	}

	if(cnt1>cnt2)cout<<"Fennec"<<endl;

	else cout<<"Snuke"<<endl;

	return 0;

}