#define _CRT_SECURE_NO_WARNINGS

#include <vector>
#include <iostream>
#include <string>
#include <functional>
#include <set>
#include <map>
#include <unordered_map>
#include <fstream>
#include <iomanip>
#include <ctime>
#include <queue>
#include <deque>
#include <math.h>
#include <cmath>
#include <stack>
#include <algorithm>
#include <list>
#include <array>
#include <valarray>
#include <unordered_map>
#include <cassert>
#include <random>
#include <cstring>
#include <sstream>
#include <numeric>
#include <iterator>

using namespace std;

#define x first
#define y second
#define mp make_pair
#define pb push_back
#define sqr(a) ((a) * (a))
#define sz(a) int((a).size())
#define all(a) a.begin(), a.end()
#define forn(i, n) for(int i = 0; i < int(n); i++) 
#define fore(i, l, r) for(int i = int(l); i < int(r); i++)
#define vec vector

typedef long long li;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;
typedef pair<int, int> pii;

template <class A, class B> ostream& operator << (ostream& out, const pair<A, B>& a) {
	return out << "(" << a.x << ", " << a.y << ")";
}

template <class A> ostream& operator << (ostream& out, const vector<A>& v) {
	out << "[";
	forn(i, sz(v)) {
		if (i) out << ", ";
		out << v[i];
	}
	return out << "]";
}

mt19937 rnd(time(NULL));

const int INF = int(1e9);
const li INF64 = li(1e18);
const int MOD = INF + 7;
const ld EPS = 1e-9;
const ld PI = acos(-1.0);
//const li MOD = 100055128505716009;
//const li P = 3e4 + 11;

const int N = 1e5 + 7;

vector<int> g[N];
int n;
set<pt> have;

vector<int> get(int x, int y) {
	//cout << x << ' ' << y << endl;
	vector<int> res;
	for (int v : g[x]) {
		if (binary_search(all(g[y]), v)) {
			//cout << "FOUND " << v << endl;
			res.pb(v);
		}
	}

	return res;
}

vector<int> tryLR() {
	for (int r : g[0]) {
		vector<int> ans;

		int l = 0;
		ans.push_back(l);

		auto it = get(l, r);
		if (sz(it) != 1) {
			continue;
		}

		//cout << l << ' ' << r << ' ' << it << endl;
		int m = it[0];
		ans.push_back(m);
		ans.push_back(r);

		while (1) {
			auto it = get(m, r);

			if (sz(it) != 2) {
				return {};
			}

			int v = it[0];
			if (v == l) {
				v = it[1];
			}

			if (v == 0) {
				return ans;
			}

			ans.pb(v);

			l = m;
			m = r;
			r = v;
		}
	}
}

bool check(vector<int>& ans) {
	if (sz(ans) != n) {
		return false;
	}

	bool res = true;
	forn(i, n) {
		int x = ans[i];
		int y = ans[(i + 1) % n];
		if (x > y) {
			swap(x, y);
		}

		res &= bool(have.count({ x, y }));

		x = ans[i];
		y = ans[(i + 2) % n];
		if (x > y) {
			swap(x, y);
		}

		res &= bool(have.count({ x, y }));
	}

	return res;
}

int main() {
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	int tt = clock();
#endif

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

	cerr.precision(15);
	cout.precision(15);
	cerr << fixed;
	cout << fixed;

	// SOLUTION GOES HERE

	int n;
	cin >> n;

	vector<vector<int>> g(n);
	forn(i, n - 1) {
		int a, b;
		cin >> a >> b;
		a--, b--;

		g[a].pb(b);
		g[b].pb(a);
	}

	auto bfs = [&](int s) {
		queue<int> q;
		vector<int> d(n, INF);
		q.push(s);
		d[s] = 0;
		while (!q.empty()) {
			int v = q.front();
			q.pop();

			for (int to : g[v]) {
				if (d[to] > d[v] + 1) {
					d[to] = d[v] + 1;
					q.push(to);
				}
			}
		}

		auto it = max_element(all(d));
		return pt{ it - d.begin(), *it };
	};

	pt v1 = bfs(0);
	pt v2 = bfs(v1.x);

	if (v2.y % 3 == 1) {
		cout << "Second\n";
	}
	else {
		cout << "First\n";
	}

	// SOLUTION ENDS HERE


#ifdef _DEBUG 
	cout << "TIME = " << clock() - tt << endl;
	tt = clock();
#endif
}

Measured memory_bytes: 15988