#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int h[N], nxt[N], adj[N], fa[N], ans, mx1, mx2, mx3, u, v, n, m, t, id, d[N];
bitset<N> vs;
namespace io {
inline char nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
template <class I>
inline void fr(I &num) {
  num = 0;
  register char c = nc();
  register int p = 1;
  while (c < '0' || c > '9') c == '-' ? p = -1, c = nc() : c = nc();
  while (c >= '0' && c <= '9') num = num * 10 + c - '0', c = nc();
  num *= p;
}
}  // namespace io
using io ::fr;
inline void dfs(const int x) {
  d[x] = (vs[x] ? 1 : d[fa[x]] + 1);
  for (register int i = h[x], j; i; i = nxt[i])
    if ((j = adj[i]) != fa[x]) fa[j] = x, dfs(j);
}
inline void add() {
  nxt[++t] = h[u], h[u] = t, adj[t] = v, nxt[++t] = h[v], h[v] = t, adj[t] = u;
}
int main() {
  fr(n);
  register int i;
  for (i = 1; i < n; ++i) fr(u), fr(v), add();
  dfs(1);
  for (i = 1; i <= n; ++i) {
    fa[i] = 0;
    if (d[i] > d[mx1]) mx1 = i;
  }
  dfs(mx1);
  for (i = 1; i <= n; ++i)
    if (d[i] > d[mx2] && i != mx1) mx2 = i;
  for (i = mx2; i; i = fa[i]) vs[i] = 1, ++ans;
  dfs(mx1);
  for (i = 1; i <= n; ++i)
    if (d[i] > d[mx3] && i != mx1 && i != mx2) mx3 = i;
  for (i = mx3; !vs[i]; i = fa[i]) vs[i] = 1, ++ans;
  printf("%d\n%d %d %d", ans - 1, mx1, mx2, mx3);
  return 0;
}
