#include "bits/stdc++.h"

using namespace std;
#ifdef _DEBUG
#define _GLIBCXX_DEBUG
#include "dump.hpp"
#else
#define dump(...)
#endif

#define int long long
#define ll long long
#define DBG 1
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define rrep(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define loop(n) rep(loop, (0), (n))
#define all(c) begin(c), end(c)
const int INF = sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = (int)(1e9) + 7;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
using pii = pair<int, int>;
// template<class T> ostream &operator<<(ostream &os,T &t){dump(t);return os;}
template <typename T, typename S>istream &operator>>(istream &is, pair<T, S> &p) { is >> p.first >> p.second; return is; }
template <typename T, typename S>ostream &operator<<(ostream &os, pair<T, S> &p) { os << p.first << " " << p.second; return os; }

template <typename T> void printvv(const vector<vector<T>> &v) {
	cerr << endl;
	rep(i, 0, v.size()) rep(j, 0, v[i].size()) {
		if (typeid(v[i][j]).name() == typeid(INF).name() and v[i][j] == INF) {
			cerr << "INF";
		}
		else
			cerr << v[i][j];
		cerr << (j == v[i].size() - 1 ? '\n' : ' ');
	}
	cerr << endl;
}

#ifndef _DEBUG
#define printvv(...)
#endif
void YES(bool f) { cout << (f ? "YES" : "NO") << endl; }
void Yes(bool f) { cout << (f ? "Yes" : "No") << endl; }
template <class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; }return false; }
template <class T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; }return false; }

vector<int> Centroid(const vector<vector<int>> &g) {
	int n = g.size();
	vector<int> centroid;
	vector<int> sz(n);
	function<void(int, int)> dfs = [&](int u, int prev) {
		sz[u] = 1;
		bool is_centroid = true;
		for (auto v : g[u]) if (v != prev) {
			dfs(v, u);
			sz[u] += sz[v];
			if (sz[v] > n / 2) is_centroid = false;
		}
		if (n - sz[u] > n / 2) is_centroid = false;
		if (is_centroid) centroid.push_back(u);
	};
	dfs(0, -1);
	return centroid;
}

void solve() {
	int N; cin >> N;
	vector<vector<int>>g(N);
	vector<int>a(N - 1), b(N - 1); rep(i, 0, N - 1) { cin >> a[i] >> b[i]; a[i]--, b[i]--; }

	rep(i, 0, N - 1) {
		g[a[i]].eb(b[i]);
		g[b[i]].eb(a[i]);
	}

	auto c = Centroid(g);
	dump(c);
	if (c.size() & 1) {
		cout << "First" << endl;
	}
	else {
		cout << "Second" << endl;
	}
}

struct Edge {
	int source, target, weight;
	Edge(int source, int target, int weight)
		: source(source), target(target), weight(weight) {}
};
struct Graph {
	int V;
	vector<vector<Edge>> g;
	Graph(int V) : V(V), g(V) {}
	void add_arc(int s, int t, int w = 1) { g[s].emplace_back(s, t, w); }
	void add_edge(int s, int t, int w = 1) { add_arc(s, t, w); add_arc(t, s, w); }
	void dfs(vector<int> &x, int v, int p, int d) {
		x[v] = d;
		rep(i, 0, g[v].size()) {
			Edge e = g[v][i];
			int u = e.target;
			if (u == p)
				continue;
			dfs(x, u, v, d + e.weight);
		}
	}
	int diameter() {
		vector<int> d(V);
		dfs(d, 0, -1, 0);
		int m = max_element(all(d)) - d.begin();
		dfs(d, m, -1, 0);
		return *max_element(all(d));
	}
};

void solve2() {
	int N;
	cin >> N;
	Graph g(N);
	rep(i, 0, N - 1) {
		int s, t; 
		cin >> s >> t;
		s--, t--;
		g.add_edge(s, t);
	}
	int d=g.diameter();

	string ans;
	if (d % 3 == 1) {
		ans = "Second";
	}
	else {
		ans = "First";
	}
	cout << ans << endl;
}

signed main(signed argc, char *argv[]) {
	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(12);

	solve2();


	return 0;
}


Measured memory_bytes: 26624