#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int n, x, y, eg, hd[MAXN], ver[2 * MAXN], nx[2 * MAXN], dep[MAXN], f[MAXN],
    mk[MAXN], dp[MAXN];
void add_edge(int x, int y) {
  ver[++eg] = y;
  nx[eg] = hd[x];
  hd[x] = eg;
  return;
}
void dfs(int x, int fa) {
  dep[x] = dep[fa] + 1, f[x] = fa;
  for (int i = hd[x]; i; i = nx[i]) {
    if (ver[i] == fa) {
      continue;
    }
    dfs(ver[i], x);
  }
  return;
}
void dfs2(int x, int fa) {
  if (mk[x]) {
    dp[x] = 0;
  } else {
    dp[x] = dp[f[x]] + 1;
  }
  for (int i = hd[x]; i; i = nx[i]) {
    if (ver[i] == fa) {
      continue;
    }
    dfs2(ver[i], x);
  }
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d%d", &x, &y);
    add_edge(x, y), add_edge(y, x);
  }
  dfs(1, 0);
  int p = 0, q = 0;
  for (int i = 1; i <= n; i++) {
    if (dep[i] > dep[p]) {
      p = i;
    }
  }
  dfs(p, 0);
  for (int i = 1; i <= n; i++) {
    if (dep[i] > dep[q]) {
      q = i;
    }
  }
  int ans = dep[q] - 1;
  int cq = q;
  while (q) {
    mk[q] = 1;
    q = f[q];
  }
  dfs2(p, 0);
  int tmp = 0;
  dp[0] = -1;
  for (int i = 1; i <= n; i++) {
    if (i != p && i != cq && dp[i] > dp[tmp]) {
      tmp = i;
    }
  }
  printf("%d\n%d %d %d\n", dp[tmp] + ans, p, cq, tmp);
  return 0;
}
