// Original C++ solution (slower):
#include<iostream>

#include<algorithm>

#include<string>

#include<functional>

#include<utility>

#include<ctime>

#include<cmath>

#include<vector>

#include<set>

#include<queue>

#include<deque>

#include<map>

#include<cstring>

#include<stack>

#include<cctype>

#include<cstdio>

#include<bitset>

#ifdef LOCAL

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

	#define tri(x) x*(x+1)/2;

	#define sqrsum(x) x*(x+1)*(2*x+1)/6;

	#define sqrsum_range(a,b) sqrsum(b)-sqrsum(a-1);

#endif

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

#define REP(i,a,b) FOR(i,a,b+1)

#define ll_max 9223372036854775807LL

#define ll_min -9223372036854775808LL

#define int_max 2147483647

#define int_min -2147483648

#define PI 3.141592653589793238462653383

#define eps 0.00000001

#define elif else if

using namespace std;

void fast()

{

	cin.tie(NULL);

	cout.tie(NULL);

	ios_base::sync_with_stdio(false);

	return ;

}

bool isprime(int x)

{

	if(x<2)

		return false;

	for(int i=2;i<=sqrt(x);i++)

		if(x%i==0)

			return false;

	return true;

}

int GCD(int a,int b)

{

	return (b?GCD(b,a%b):a);

}

struct Tm

{

	int h,m,s;

	bool add()

	{

		s++;

		if(s==60)

			m++,

			s=0;

		if(m==60)

			h++,

			m=0;

		return (h<100);

	}

	void print()

	{

		printf("%02d:%02d:%02d",h,m,s);

		return ;

	}

	void println()

	{

		print();

		puts("");

	}

};

vector<int> G[100100];

int dist[100100][2];

void dfs(int now,int pre,int x)

{

	for(int i=0;i<G[now].size();i++)

		if(G[now][i]!=pre)

		{

			dist[G[now][i]][x]=dist[now][x]+1;

			dfs(G[now][i],now,x);

		}

	return ;

}

int main()

{

	int N;

	cin>>N;

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

	{

		int a,b;

		cin>>a>>b;

		G[a].push_back(b);

		G[b].push_back(a);

	}

	dfs(1,0,0);

	dfs(N,0,1);

	int cnt1=0,cnt2=0;

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

		if(dist[i][0]<=dist[i][1])

			cnt1++;

		else	cnt2++;

	if(cnt2>=cnt1)

		puts("Snuke");

	else	puts("Fennec");

	return 0;

}

// Optimized solution to the same problem (faster):
#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;}

vector<int> bfs(int n,vector<vector<int> >&G,int s){

	vector<int>d(n,INF);d[s]=0;

	queue<int>q;q.push(s);

	while(!q.empty()){

		int u=q.front();q.pop();

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

			int to=G[u][i];

			if(d[to]>d[u]+1){

				d[to]=d[u]+1;

				q.push(to);

			}

		}

	}

	return d;

}

int main(){

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

    int n;

	cin>>n;

	vector<vector<int> >G(n);

	rep(i,n-1){

		int a,b;

		cin>>a>>b;

		a--;b--;

		G[a].push_back(b);

		G[b].push_back(a);

	}

	vector<int>d1=bfs(n,G,0);

	vector<int>d2=bfs(n,G,n-1);

	int n1=0,n2=0;

	rep(i,n){

		if(d1[i]<=d2[i])n1++;

		else n2++;

	}

	string ans=n1>n2?"Fennec":"Snuke";

	cout<<ans<<endl;

	return 0;

}

// Fastest known solution for this problem: