#include <bits/stdc++.h>   namespace ZDY {   #pragma GCC optimize(3)   template <class T>   __inline__ __attribute__((always_inline)) T ABS(T x) {     return x > 0 ? x : -x;   }   template <class T>   __inline__ __attribute__((always_inline)) T MAX(T x, T y) {     return x > y ? x : y;   }   template <class T>   __inline__ __attribute__((always_inline)) T MIN(T x, T y) {     return x < y ? x : y;   }   template <class T>   __inline__ __attribute__((always_inline)) T GCD(T x, T y) {     return y ? GCD(y, x % y) : x;   }   template <class T>   __inline__ __attribute__((always_inline)) void SWAP(T &x, T &y) {     T t = x;     x = y;     y = t;   }   }  // namespace ZDY   using namespace ZDY;   using namespace std;   namespace IO {   const int str = 1 << 20;   static char in_buf[str], *in_s, *in_t;   bool __ = 0;   __inline__ __attribute__((always_inline)) char gc() {     return (in_s == in_t) &&                (in_t = (in_s = in_buf) + fread(in_buf, 1, str, stdin)),            in_s == in_t ? EOF : *in_s++;   }   __inline__ __attribute__((always_inline)) void in(string &ch) {     ch.clear();     if (__) return;     char c;     while ((c = gc()) != EOF && isspace(c))       ;     if (c == EOF) {       __ = 1;       return;     }     ch += c;     while ((c = gc()) != EOF && !isspace(c)) ch += c;     if (c == EOF) __ = 1;   }   __inline__ __attribute__((always_inline)) void in(char &ch) {     if (__) return;     char c;     while ((c = gc()) != EOF && isspace(c))       ;     if (c == EOF)       __ = 1;     else       ch = c;   }   __inline__ __attribute__((always_inline)) void in(char *ch) {     *ch =   0 ;     if (__) return;     char c;     while ((c = gc()) != EOF && isspace(c))       ;     if (c == EOF) {       __ = 1;       return;     }     *ch = c;     ch++;     while ((c = gc()) != EOF && !isspace(c)) *ch = c, ch++;     if (c == EOF) __ = 1;     *ch =   0 ;   }   template <typename T>   __inline__ __attribute__((always_inline)) void in(T &x) {     if (__) return;     char c = gc();     bool f = 0;     while (c != EOF && (c <  0  || c >  9 )) f ^= (c ==  - ), c = gc();     if (c == EOF) {       __ = 1;       return;     }     x = 0;     while (c != EOF &&  0  <= c && c <=  9 ) x = x * 10 + c - 48, c = gc();     if (c == EOF) __ = 1;     if (f) x = -x;   }   template <typename T, typename... arr>   __inline__ __attribute__((always_inline)) void in(T &x, arr &...y) {     in(x), in(y...);   }   const char ln =   n ;   static char out_buf[str], *out_s = out_buf, *out_t = out_buf + str;   __inline__ __attribute__((always_inline)) void flush() {     fwrite(out_buf, 1, out_s - out_buf, stdout);     out_s = out_buf;   }   __inline__ __attribute__((always_inline)) void pt(char c) {     (out_s == out_t) ? (fwrite(out_s = out_buf, 1, str, stdout), *out_s++ = c)                      : (*out_s++ = c);   }   __inline__ __attribute__((always_inline)) void out(const char *s) {     while (*s) pt(*s++);   }   __inline__ __attribute__((always_inline)) void out(char *s) {     while (*s) pt(*s++);   }   __inline__ __attribute__((always_inline)) void out(char c) { pt(c); }   __inline__ __attribute__((always_inline)) void out(string s) {     for (int i = 0; s[i]; i++) pt(s[i]);   }   template <typename T>   __inline__ __attribute__((always_inline)) void out(T x) {     if (!x) {       pt( 0 );       return;     }     if (x < 0) pt( - ), x = -x;     char a[50], t = 0;     while (x) a[t++] = x % 10, x /= 10;     while (t--) pt(a[t] +  0 );   }   template <typename T, typename... arr>   __inline__ __attribute__((always_inline)) void out(T x, arr &...y) {     out(x), out(y...);   }   }  // namespace IO   using namespace IO;   int n, head[1000011], cnt = 0, a[1000011];   struct edge {     int to, nxt;   } e[1000011 * 2];   __inline__ __attribute__((always_inline)) void add(int x, int y) {     e[++cnt].to = y;     e[cnt].nxt = head[x];     head[x] = cnt;   }   void dfs(int x, int d) {     a[x] = d;     for (int i(head[x]), to; to = e[i].to, i; i = e[i].nxt)       if (!a[to]) dfs(to, MIN(d, to));   }   int main() {     int q, opt, x, y, la = 0, tt = 2122219134;     in(n, q);     for (int i(1); i <= n - 1; ++i) in(x, y), add(x, y), add(y, x);     in(y, x);     x = x % n + 1;     dfs(x, x);     while (--q) {       in(opt, x);       x = (la + x) % n + 1;       if (opt == 1)         tt = MIN(tt, a[x]);       else         out(la = MIN(tt, a[x]), ln);     }     flush();   }