#include <bits/stdc++.h>
using namespace std;
long long n;
vector<long long> adj[200005];
long long depth[200005];
long long depth2[200005];
long long parent[200005][22];
long long a, b, c;
pair<long long, long long> bfs(long long u) {
  long long dist[200005];
  for (long long i = 0; i < 200005; i++) dist[i] = -1;
  queue<long long> q;
  q.push(u);
  dist[u] = 0;
  while (!q.empty()) {
    long long t = q.front();
    q.pop();
    for (auto v : adj[t]) {
      if (dist[v] == -1) {
        q.push(v);
        dist[v] = dist[t] + 1;
      }
    }
  }
  long long maxDis = 0;
  long long nodeIdx;
  for (long long i = 1; i <= n; i++) {
    if (dist[i] > maxDis) {
      maxDis = dist[i];
      nodeIdx = i;
    }
  }
  return make_pair(nodeIdx, maxDis);
}
void update_depth() {
  for (long long i = 0; i < 200005; i++) depth[i] = -1;
  depth[a] = 0;
  queue<long long> q;
  q.push(a);
  while (!q.empty()) {
    long long u = q.front();
    q.pop();
    for (auto v : adj[u]) {
      if (depth[v] == -1) {
        depth[v] = depth[u] + 1;
        q.push(v);
      }
    }
  }
}
void dfs(long long cur, long long prev) {
  depth2[cur] = depth2[prev] + 1;
  parent[cur][0] = prev;
  for (auto v : adj[cur]) {
    if (v != prev) dfs(v, cur);
  }
}
void precomputeSparseMatrix() {
  for (long long i = 1; i < 22; i++) {
    for (long long node = 1; node <= n; node++) {
      if (parent[node][i - 1] != -1)
        parent[node][i] = parent[parent[node][i - 1]][i - 1];
    }
  }
}
long long lca(long long u, long long v) {
  if (depth2[v] < depth2[u]) swap(u, v);
  long long diff = depth2[v] - depth2[u];
  for (long long i = 0; i < 22; i++)
    if ((diff >> i) & 1) v = parent[v][i];
  if (u == v) return u;
  for (long long i = 22 - 1; i >= 0; i--)
    if (parent[u][i] != parent[v][i]) {
      u = parent[u][i];
      v = parent[v][i];
    }
  return parent[u][0];
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  for (long long i = 0; i < n - 1; i++) {
    long long u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  a = bfs(1).first;
  b = bfs(a).first;
  update_depth();
  dfs(a, 0);
  precomputeSparseMatrix();
  long long ans = -1;
  long long idx;
  for (long long i = 1; i <= n; i++) {
    if (i == a || i == b) continue;
    long long node = lca(b, i);
    long long temp_ans = depth[i] - depth[node];
    if (temp_ans > ans) {
      ans = temp_ans;
      idx = i;
    }
  }
  c = idx;
  cout << depth[b] + ans << "\n";
  cout << a << " " << b << " " << c << "\n";
  return 0;
}
