// 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: 4.4458530064613395x):
#include <algorithm>

#include <bitset>

#include <cmath>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <deque>

#include <list>

#include <map>

#include <iomanip>

#include <iostream>

#include <queue>

#include <set>

#include <stack>

#include <string>

#include <utility>

#include <vector>

#define fi first

#define se second

#define pb push_back

//#define mp make_pair

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

using namespace std;

typedef long long LL;

typedef pair<int,int> pii;

const int INF=0x3f3f3f3f;

const int dx[]={0,1,-1,0},dy[]={1,0,0,-1};

//const int MOD=998244353;

const int N=2e5+10;



inline int read(){

	int ww=1,xx=0;char ch=getchar();

	while(!isdigit(ch)){if(ch=='-') ww=-ww;ch=getchar();}

	while(isdigit(ch)){xx=(xx<<1)+(xx<<3)+(ch^48);ch=getchar();}

	return ww*xx;

}



int n=read();

int head[N];

int cnt;

int dist1[N],dist2[N],ans;



struct Edge{

	int to,nxt;

}ed[N];



void add_edge(int a,int b){

	ed[++cnt].to=b;

	ed[cnt].nxt=head[a];

	head[a]=cnt;

}



void dfs1(int u,int p){

	for(int i=head[u];i!=-1;i=ed[i].nxt){

		int v=ed[i].to;

		if(v!=p){

			dist1[v]=dist1[u]+1;

			dfs1(v,u);

		}

	}

}



void dfs2(int u,int p){

	for(int i=head[u];i!=-1;i=ed[i].nxt){

		int v=ed[i].to;

		if(v!=p){

			dist2[v]=dist2[u]+1;

			dfs2(v,u);

		}

	}

}



signed main(){

//	freopen(".in","r",stdin);

//	freopen(".out","w",stdout);

	for(int i=1;i<=n;i++) head[i]=-1;

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

		int fr,to;

		fr=read();

		to=read();

		add_edge(fr,to);

		add_edge(to,fr);

	}

	dist1[1]=0;

	dist2[n]=0;

	dfs1(1,-1);

	dfs2(n,-1);

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

		if(dist1[i]<=dist2[i])

			ans++;

	if(ans>n-ans) puts("Fennec");

	else puts("Snuke");

	return 0;

}

/*

7

3 6

1 2

3 1

7 4

5 7

1 4



4

1 4

4 2

2 3

*/