#include <bits/stdc++.h>
using namespace std;
int dis[200005] = {0}, par[200005];
vector<int> g[200005];
void DFS(int v, int parent) {
  for (auto x : g[v]) {
    if (x != parent) {
      par[x] = v;
      DFS(x, v);
    }
  }
}
int main() {
  int i, n, from, to, v;
  scanf("%d", &n);
  for (i = 0; i < n - 1; i++) {
    scanf("%d%d", &from, &to);
    g[from].emplace_back(to);
    g[to].emplace_back(from);
  }
  queue<int> que;
  que.push(1);
  dis[1] = 1;
  while (que.size()) {
    v = que.front();
    que.pop();
    for (auto x : g[v]) {
      if (!dis[x]) {
        dis[x] = dis[v] + 1;
        que.push(x);
      }
    }
  }
  memset(dis, 0, sizeof(dis));
  int source = v, source2, ans = 0;
  que.push(v);
  dis[v] = 1;
  while (que.size()) {
    v = que.front();
    que.pop();
    for (auto x : g[v]) {
      if (!dis[x]) {
        dis[x] = dis[v] + 1;
        que.push(x);
      }
    }
  }
  source2 = v;
  memset(dis, 0, sizeof(dis));
  par[source] = source;
  DFS(source, -1);
  while (par[v] != v) {
    que.push(v);
    dis[v] = 1;
    v = par[v];
    ans++;
  }
  que.push(v);
  dis[v] = 1;
  while (que.size()) {
    v = que.front();
    que.pop();
    for (auto x : g[v]) {
      if (!dis[x]) {
        dis[x] = dis[v] + 1;
        que.push(x);
      }
    }
  }
  if (v == source || v == source2) {
    printf("%d\n%d %d ", ans, source, source2);
    for (i = 1; i <= n; i++)
      if (i != source && i != source2) {
        printf("%d\n", i);
        return 0;
      }
  } else
    printf("%d\n%d %d %d\n", ans + dis[v] - 1, source, source2, v);
}
