#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
template <class T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = 0;
  while (!isdigit(c)) {
    if (c == '-') flag = 1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 3) + (x << 1) + c - '0';
    c = getchar();
  }
  x = flag ? -x : x;
}
template <class T>
inline void write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
const int maxn = 5e5 + 10;
const int mod = 998244353;
struct Edge {
  int next, ed;
};
Edge e[maxn * 2];
int head[maxn], cnt;
void addEdge(int st, int ed) {
  e[cnt].ed = ed;
  e[cnt].next = head[st];
  head[st] = cnt++;
}
bool vis[maxn];
int sum[maxn], d[maxn];
int ansl[maxn], ansr[maxn];
void get(int k) {
  sum[k] = 1;
  for (int i = head[k]; i != -1; i = e[i].next) {
    int ed = e[i].ed;
    if (sum[ed] == 0) {
      get(ed);
      sum[k] += sum[ed];
      ++d[k];
    }
  }
}
void dfs(int k, int l, int r) {
  vis[k] = 1;
  ansr[k] = l + d[k];
  int c = l, temp = r;
  for (int i = head[k]; i != -1; i = e[i].next) {
    int ed = e[i].ed;
    if (!vis[ed]) {
      ansl[ed] = c;
      ++c;
      dfs(ed, temp - sum[ed] * 2 + 2, temp);
      temp -= sum[ed] * 2 - 1;
    }
  }
}
int main() {
  int n;
  read(n);
  memset(head, -1, sizeof(head));
  for (int i = 1; i < n; ++i) {
    int st, ed;
    scanf("%d %d", &st, &ed);
    addEdge(st, ed);
    addEdge(ed, st);
  }
  get(1);
  ansl[1] = 1;
  dfs(1, 2, n * 2);
  for (int i = 1; i <= n; ++i) {
    printf("%d %d\n", ansl[i], ansr[i]);
  }
}
