#include <bits/stdc++.h>
using namespace std;
struct edge {
  int v, n;
} e[1000005];
int head[1000005], cnt, dis[1000005], dep[1000005], f[1000005][25];
inline void add(int u, int v) {
  e[++cnt].v = v;
  e[cnt].n = head[u];
  head[u] = cnt;
}
inline void DFS(int u, int fa) {
  f[u][0] = fa;
  for (int i = 1; i <= 20; i++) f[u][i] = f[f[u][i - 1]][i - 1];
  for (int i = head[u]; i; i = e[i].n) {
    if (e[i].v == fa) continue;
    dep[e[i].v] = dep[u] + 1;
    DFS(e[i].v, u);
  }
}
inline void dfs(int u) {
  for (int i = head[u]; i; i = e[i].n) {
    if (dis[e[i].v] > dis[u] + 1) {
      dis[e[i].v] = dis[u] + 1;
      dfs(e[i].v);
    }
  }
}
inline int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 20; i >= 0; i--) {
    if (dep[f[x][i]] >= dep[y]) x = f[x][i];
  }
  if (x == y) return x;
  for (int i = 20; i >= 0; i--) {
    if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  }
  return f[x][0];
}
int main(int argc, char** argv) {
  int n;
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    add(u, v);
    add(v, u);
  }
  for (int i = 1; i <= n; i++) dis[i] = 1e9;
  dis[1] = 0;
  dfs(1);
  int mx = -1, w = 0;
  for (int i = 1; i <= n; i++) {
    if (dis[i] > mx) mx = dis[i], w = i;
  }
  for (int i = 1; i <= n; i++) dis[i] = 1e9;
  dis[w] = 0;
  dfs(w);
  mx = -1;
  int a = 0;
  for (int i = 1; i <= n; i++) {
    if (dis[i] > mx) mx = dis[i], a = i;
  }
  int b = w;
  DFS(a, 0);
  int c = 0, ans = mx;
  for (int i = 1; i <= n; i++) {
    if (i == a || i == b) continue;
    int t = dep[i] - dep[lca(i, b)] + mx;
    if (t >= ans) ans = t, c = i;
  }
  cout << ans << endl << a << " " << b << " " << c;
  return 0;
}
