#include <iostream>
#include <fstream>
#include <vector>
#define nmax 50005
#define mmax 10005
#define cmax 80
using namespace std;
char lazy[cmax][4*nmax];
int H[cmax][4*nmax];
int first[nmax], last[nmax];
int n, m, c, dim = 0, a, b, op, x, val, newColor, sol, each, qty;
vector <int> v[nmax];
void dfs(int cur) {
first[cur] = ++dim;
for(int i=0; i<int(v[cur].size()); i++)
if(first[v[cur][i]] == 0) dfs(v[cur][i]); //echivalenta cu v[cur][i] nevizitat
last[cur] = dim;
}
void sendLazy(int color, int node, int lo, int hi) {
int mid = (lo + hi) >> 1;
H[color][2*node] = (mid - lo + 1) * lazy[color][node];
H[color][2*node+1] = (hi - mid) * lazy[color][node];
lazy[color][2*node] = lazy[color][node];
lazy[color][2*node+1] = lazy[color][node];
lazy[color][node] = -1;
}
void update(int color, int node, int lo, int hi, int a, int b, int val) {
if(a <= lo && hi <= b) {
H[color][node] = (hi - lo + 1) * val;
lazy[color][node] = val;
return;
}
int mid = (lo + hi) >> 1;
if(lazy[color][node] != -1) sendLazy(color, node, lo, hi);
if(a <= mid) update(color, 2*node, lo, mid, a, b, val);
if(mid < b) update(color, 2*node+1, mid+1, hi, a, b, val);
H[color][node] = H[color][2*node] + H[color][2*node+1];
}
void query(int color, int node, int lo, int hi, int a, int b) {
if(a <= lo && hi <= b) {
each += H[color][node];
return;
}
int mid = (lo + hi) >> 1;
if(lazy[color][node] != -1) sendLazy(color, node, lo, hi);
if(a <= mid) query(color, 2*node, lo, mid, a, b);
if(mid < b) query(color, 2*node+1, mid+1, hi, a, b);
}
int main() {
ifstream f("adunare.in");
ofstream g("adunare.out");
f>>n>>m;
for(int i=1; !i; i++) {
f>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1);
for(int i=0; i<=n && !i; i++) v[i].clear();
for(int color=1; color<=c; color++)
for(int node=1; node<=4*n; node++)
lazy[color][node] = -1;
update(1, 1, 1, n, 1, n, 1);
g<<m+n<<"\n";
for(int i=1; i<=m && !i; i++) {
f>>op>>x;
if(op == 0) {
f>>newColor;
for(int color=1; color<=c; color++)
if(color != newColor) update(color, 1, 1, n, first[x], last[x], 0);
update(newColor, 1, 1, n, first[x], last[x], 1);
}
if(op == 1) {
sol = 0;
qty = 0;
for(int color=1; color<=c; color++) {
each = 0;
query(color, 1, 1, n, first[x], last[x]);
if(each > qty) qty = each, sol = color;
}
g<<sol<<" "<<qty<<"\n";
}
}
return 0;
}