// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



typedef long long ll;

const int maxn=1e5+7;

const int inf=1e9+7;

const int mod=1e9+7;

#define pb push_back

#define pii pair<int,int>

#define F first

#define S second

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

#define rep2(i,a,b) for (int i=(a);i<=(b);i++)



vector <int> G[maxn];

set <int> fennec,snuck;

vector<int> color;

bool v[maxn]={0};

int sub[maxn]={0};



bool dfs (int now,int target)

{ v[now]=1;

if (now==target) {

	color.pb(now);

	return 1;

}

	for (int i:G[now])

	{

		if (!v[i])

		{

			if (dfs(i,target)) 

			{

			color.pb(now);

			return 1;

			}

		}

	}

	return 0;

} 



int dfs2(int now)

{

	v[now]=1;

	int sum=0;

	for (int i:G[now])

	{

		if (!v[i])

		{

			if (fennec.find(i)==fennec.end()&&

			snuck.find(i)==snuck.end())

			{

			sum+=1;

			//cout<<now<<' '<<i<<endl;

			sum+=dfs2(i);

			}

			else dfs2(i);

		}

	}

	sub[now]=sum;

	return sum;

} 



int main()

{

 	ios::sync_with_stdio(0); cin.tie(0);

 	int n;

 	cin>>n;

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

 	{

 		int a,b;

 		cin>>a>>b;

 		G[a].pb(b);

 		G[b].pb(a);

	}

	//cout<<"---"<<endl;

	dfs(1,n);

	memset(v,0,sizeof(v));

	int size=color.size();

	for (int i=0;i<size;i++)

	{

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

		if ((i+1)<=size/2) snuck.insert(color[i]);

		else fennec.insert(color[i]);

	}

	dfs2(1);

	int sums=0,sumf=0;

	//for (int i=1;i<=n;i++) cout<<sub[i]<<' ';

	for (auto j=snuck.begin();j!=snuck.end();j++)

	{ /*cout<<sub[(*j)]<<'/'; */sums+=sub[(*j)];}

	 for (auto j=fennec.begin();j!=fennec.end();j++)

	{/*cout<<sub[(*j)]<<'*';*/sumf+=sub[(*j)];}

	if (sumf+size-size/2>sums+size/2) cout<<"Fennec"<<endl;

	else cout<<"Snuke"<<endl;

}

// Faster C++ solution for the same problem (measured speedup: 2.036044937269985x):
#include <iostream>

#include <cstring>

#include <queue>

using namespace std;

const int maxn = 1e5 + 10;

const int maxm = 1e5 + 10;

struct edge{

	int to;

	int next;

}Edge[2 * maxm];

int head[maxn], pos, n, color[maxn];

void init(){

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

	for(int i = 0; i < maxn; i++) color[i] = -1; // -1 is uncolored 1 is whrite, 0 is black

	pos = 0;

}

void addEdge(int u, int v){

	Edge[pos].to = v;

	Edge[pos].next = head[u];

	head[u] = pos;

	pos++;

}

void BFS(){

	queue <int> q;

	color[1] = 0;

	color[n] = 1;

	q.push(1);

	q.push(n);

	while(!q.empty()){

		int h = q.front();

		q.pop();

		for(int i = head[h]; i != -1; i = Edge[i].next){

			if(color[Edge[i].to] == -1){

				color[Edge[i].to] = color[h];

				q.push(Edge[i].to);

			}

		}

	}

}

// void BFS(){

// 	queue <int> qw;

// 	queue <int> qb;

// 	qw.push(n);

// 	color[n] = 1;

// 	qb.push(1);

// 	color[1] = 0;

// 	while(!qw.empty() || !qb.empty()){

// 		if(!qb.empty()){

// 			int h = qb.front();

// 			//cout << "B" << h << endl;

// 			qb.pop();

// 			for(int i = head[h]; i != -1; i = Edge[i].next){

// 				if(color[Edge[i].to] == -1){

// 					//cout << Edge[i].to << " ";

// 					color[Edge[i].to] = 0;

// 					qb.push(Edge[i].to);

// 				}

// 			}

// 			//cout << endl;

// 		}

// 		if(!qw.empty()){

// 			int h = qw.front();

// 			//cout << "W" << h << endl;

// 			qw.pop();

// 			for(int i = head[h]; i != -1; i = Edge[i].next){

// 				if(color[Edge[i].to] == -1){

// 					//cout << Edge[i].to << " ";

// 					color[Edge[i].to] = 1;

// 					qw.push(Edge[i].to);

// 				}

// 			}

// 			//cout << endl;

// 		}

// 	}



// }

int main(){

	//freopen("input.txt", "r", stdin);

	while(scanf("%d", &n) != EOF){

		init();

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

			int u, v;

			scanf("%d%d", &u, &v);

			addEdge(u, v);

			addEdge(v, u);

		}

		//cout << n << endl;

		BFS();

		int white = 0, black = 0;

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

			//cout << i << ":"<< color[i] << endl;

			if(color[i] == 1) white++;

			else black++;

		}

		//cout << white <<" "<< black << endl;

		if(white < black) printf("Fennec\n");

		else printf("Snuke\n");

	}

	return 0;

}