#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int vis[N], dist[N], p[N];
int a, b, c;
vector<int> adj[N];
queue<int> q;
void bfs(int u) {
  vis[u]++;
  q.push(u);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    for (auto k : adj[t]) {
      if (!vis[k]) {
        vis[k]++;
        dist[k] = dist[t] + 1;
        q.push(k);
        p[k] = t;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long n;
  cin >> n;
  for (long long i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  int ans = 0;
  int d = 0;
  for (long long i = 1; i < n + 1; i++)
    if (adj[i].size() == 1) a = i;
  bfs(1);
  for (long long i = 1; i < n + 1; i++) {
    d = max(d, dist[i]);
    if (d == dist[i]) a = i;
  }
  memset(dist, 0, sizeof(dist));
  memset(vis, 0, sizeof(vis));
  for (long long i = 1; i < n + 1; i++) p[i] = i;
  bfs(a);
  d = 0;
  for (long long i = 1; i < n + 1; i++) {
    d = max(d, dist[i]);
    if (d == dist[i]) b = i;
  }
  memset(dist, 0, sizeof(dist));
  memset(vis, 0, sizeof(vis));
  int father = p[b];
  vis[father]++;
  vis[a]++;
  vis[b]++;
  while (1) {
    q.push(father);
    if (father == p[father]) break;
    father = p[father];
    vis[father]++;
  }
  int f = 0;
  for (long long i = 1; i < n + 1; i++)
    if (adj[i].size() > 2) f++;
  if (!f) {
    cout << n - 1 << "\n";
    cout << a << " " << q.front() << " " << b;
    return 0;
  }
  ans += q.size();
  bfs(q.front());
  d = 0;
  for (long long i = 1; i < n + 1; i++) {
    d = max(d, dist[i]);
    if (d == dist[i]) c = i;
  }
  cout << ans + d << "\n";
  cout << a << " " << c << " " << b << "\n";
}
