#include <bits/stdc++.h>
using namespace std;

int n;
string F = "Fennec";
string S = "Snuke";
class Edge{
	public:
		long long cost;
		int from, to;
		Edge(long long c, int f, int t){
			cost = c;
			from = f;
			to = t;
		}
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;
void readGraph(Graph &g, int E, bool D, bool C){ // E:NumofEdges, D:Directed, C:Costed
	for(int i=0; i<E; ++i){
		Edge e(1, 0, 0);
		if(!C) cin >> e.from >> e.to;
		else cin >> e.from >> e.to >> e.cost;
		--e.from;
		--e.to;
		g[e.from].push_back(e);
		if(!D){
			swap(e.from, e.to);
			g[e.from].push_back(e);
		}
	}
}
bool operator < (const Edge &e, const Edge &f){
	return e.cost != f.cost ? e.cost > f.cost : e.from != f.from ? e.from < f.from : e.to < f.to;
}
constexpr long long INF = 1e18+9;
void dijkstra(int s, const Graph &g, vector<long long> &dist, vector<long long> &pre){
	int V = g.size();
	dist = vector<long long>(V, INF);
	dist[s] = 0;
	pre = vector<long long>(V);
	for(int i=0; i<V; ++i)
		pre[i] = i;
	priority_queue<Edge> q;
	q.push(Edge(0, s, s));
	while(!q.empty()){
		Edge e = q.top();
		q.pop();
		if(dist[e.to] < e.cost) continue;
		for(int i=0; i<(int)g[e.to].size(); ++i){
			Edge f = g[e.to][i];
			if(dist[f.to] > dist[e.to] + f.cost){
				dist[f.to] = dist[e.to] + f.cost;
				q.push(Edge(dist[f.to], s, f.to));
				pre[f.to] = f.from;
			}
		}
	}
}

long long dfs(Graph &g, int x, int p){
	long long res = 1;
	for(int i=0; i<g[x].size(); ++i)
		if(g[x][i].to != p)
			res += dfs(g, g[x][i].to, x);
	return res;
}

int main(){
//	cin.tie(0);
//	ios::sync_with_stdio(false);
	cin >> n;
	Graph g(n);
	readGraph(g, n-1, false, false);
	vector<long long> d, p;
	dijkstra(0, g, d, p);
	vector<long long> ne(n);
	int t = n-1;
	while(t != 0){
		ne[p[t]] = t;
		t = p[t];
	}
/*	for(int i=0; i<d.size(); ++i)
		cout << d[i] << (i == d.size()-1 ? "\n" : " ");
	for(int i=0; i<p.size(); ++i)
		cout << p[i] << (i == p.size()-1 ? "\n" : " ");
	for(int i=0; i<ne.size(); ++i)
		cout << ne[i] << (i == ne.size()-1 ? "\n" : " ");
*/	vector<long long> v, w;
	v.push_back(0);
	w.push_back(0);
	t = 0;
//	cout << 0 << "\t" << 999 << "\t" << 998 << "\t" << n-1 << "\n";
//	cout << p[0] << "\t" << p[999] << "\t" << p[998] << "\t" << p[n-1] << "\n";
//	cout << ne[0] << "\t" << ne[999] << "\t" << ne[998] << "\t" << ne[n-1] << "\n";
	while(t != n-1){
//		cout << t << "\n";
		v.push_back(0);
		w.push_back(ne[t]);
		t = ne[t];
	}
//	cout << "hoge\n";
	for(int i=0; i<w.size(); ++i){
		v[i] = 1;
		for(int j=0; j<g[w[i]].size(); ++j){
			bool f = false;
			if(i==0){
				if(g[w[i]][j].to != ne[w[i]]) f = true;
			}else if(i==w.size()-1){
				if(g[w[i]][j].to != p[w[i]]) f = true;
			}else{
				if(g[w[i]][j].to != p[w[i]] && g[w[i]][j].to != ne[w[i]])
					f = true;
			}
			if(f) v[i] += dfs(g, g[w[i]][j].to, w[i]);
		}
	}
//	for(int i=0; i<v.size(); ++i)
//		cout << v[i] << (i == v.size()-1 ? "\n" : " " );
//	for(int i=0; i<w.size(); ++i)
//		cout << w[i] << (i == w.size()-1 ? "\n" : " ");
	long long f = 0, s = 0;
	for(int i=1; i<v.size(); ++i)
		v[i] += v[i-1];
	f = v[((int)v.size()-1)/2];
	s = v[(int)v.size()-1] - f;
//	cout << "f" << f << " " << "s" << s << "\n";
	cout << (f > s ? F : S) << "\n";
}

Measured memory_bytes: 11380