#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const long double eps = 1e-6;
const long long maxn = 2e5 + 1;
vector<long long> g[maxn], d;
void dfs_d(long long v, long long pr, long long de) {
  d[v] = de;
  for (long long u : g[v]) {
    if (u == pr) continue;
    dfs_d(u, v, de + 1);
  }
}
const long long lg = 23;
long long p[maxn][lg], tin[maxn], tout[maxn];
long long t;
void dfs_lca(long long v, long long pr) {
  tin[v] = t++;
  p[v][0] = pr;
  for (long long i = 1; i < lg; ++i) {
    p[v][i] = p[p[v][i - 1]][i - 1];
  }
  for (long long u : g[v]) {
    if (u == pr) continue;
    dfs_lca(u, v);
  }
  tout[v] = t++;
}
bool check(long long a, long long b) {
  return tin[a] <= tin[b] && tout[b] <= tout[a];
}
long long lca(long long a, long long b) {
  if (check(a, b)) return a;
  if (check(b, a)) return b;
  for (long long i = lg - 1; i >= 0; --i) {
    if (!check(p[a][i], b)) {
      a = p[a][i];
    }
  }
  return p[a][0];
}
long long get(long long a, long long b) { return d[a] + d[b] - d[lca(a, b)]; }
signed main() {
  ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  long long n;
  cin >> n;
  for (long long i = 0; i < n - 1; ++i) {
    long long a, b;
    cin >> a >> b, --a, --b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  d.assign(n, 0);
  dfs_d(0, -1, 0);
  long long a = max_element(d.begin(), d.end()) - d.begin();
  d.assign(n, 0);
  dfs_d(a, -1, 0);
  long long b = max_element(d.begin(), d.end()) - d.begin();
  t = 1;
  dfs_lca(a, a);
  long long c = -1, res = -1;
  for (long long v = 0; v < n; ++v) {
    if (v == a || v == b) continue;
    long long val = get(v, b);
    if (val > res) {
      res = val;
      c = v;
    }
  }
  cout << res << "\n" << a + 1 << " " << b + 1 << " " << c + 1 << "\n";
  return 0;
}
