#include<bits/stdc++.h>
#define int long long int
using namespace std;
int max_sum=-(int)1e9;
int max_node;
struct node
{
int val;
int dis;
vector<node*>child;
node* par;
int prority;
};
int cmp(node* a,node* b)
{
return a->prority<b->prority;
}
int cmp1(int a,int b)
{
return a>b;
}
node* Node[(int)1e6];
node* createnode()
{
node* newnode=(node*)malloc(sizeof(node));
newnode->child.clear();
newnode->par=NULL;
return newnode;
}
void travel_tree(node* root)
{
if(root==NULL)
{
return;
}
cout<<root->val<<" "<<root->dis<<" "<<root->prority<<endl;
for(int i=0;i<root->child.size();i++)
{
travel_tree(root->child[i]);
}
}
int maxs(int a,int b)
{
if(a>b)return a;
return b;
}
int checktree(node* root)
{
if(root==NULL)
{
return 0;
}
if(root->child.empty())
{
if(root->dis>max_sum)
{
max_sum=root->dis;
max_node=root->val;
//cout<<"max_sum"<<max_sum<<endl;
//cout<<"max_node"<<max_node<<endl;
}
return root->dis;
}
//midpoint
vector<int>dis;
for(int i=0;i<root->child.size();i++)
{
dis.emplace_back(checktree(root->child[i]));
}
sort(dis.begin(),dis.end(),cmp1);
//midpoint
if(dis.size()>=2&&dis[0]+dis[1]+root->dis>max_sum)
{
//cout<<"2"<<endl;
max_sum=dis[0]+dis[1]+root->dis;
max_node=root->val;
//cout<<"max_sum"<<max_sum<<endl;
//cout<<"max_node"<<max_node<<endl;
}
if(dis.size()==1&&dis[0]+root->dis>max_sum)
{
//cout<<"1"<<endl;
max_sum=dis[0]+root->dis;
max_node=root->val;
//cout<<"max_sum"<<max_sum<<endl;
//cout<<"max_node"<<max_node<<endl;
}
int max_route;
if(dis.size()>=2)
{
max_route=maxs(dis[0],dis[1]);
}
else
{
max_route=dis[0];
}
if(max_route<0)
{
if(root->dis>max_sum)
{
max_sum=root->dis;
max_node=root->val;
//cout<<"max_sum"<<max_sum<<endl;
//cout<<"max_node"<<max_node<<endl;
}
return root->dis;
}
else
{
if(root->dis+max_route>max_sum)
{
max_sum=root->dis+max_route;
max_node=root->val;
//cout<<"max_sum"<<max_sum<<endl;
//cout<<"max_node"<<max_node<<endl;
}
return root->dis+max_route;
}
}
void solve()
{
for(int i=0;i<sizeof(Node)/sizeof(node*);i++)
{
//cout<<sizeof(Node)/sizeof(node*)<<endl;
Node[i]=NULL;
}
int n,m;
cin>>n>>m;
node* root=createnode();
int val,dis,par;
cin>>val>>dis;
root->par=NULL;
root->val=val;
root->dis=dis;
Node[val]=root;
while(n--)
{
int par,val,dis;
cin>>par>>val>>dis;
node* newnode;
if(Node[val]==NULL)
{
newnode=createnode();
newnode->dis=dis;
newnode->val=val;
Node[val]=newnode;
}
else
{
newnode=Node[val];
newnode->val=val;
newnode->dis=dis;
}
if(Node[par]==NULL)
{
node* parentnode=createnode();
parentnode->child.emplace_back(newnode);
newnode->par=parentnode;
parentnode->val=par;
Node[par]=parentnode;
}
else
{
Node[par]->child.emplace_back(newnode);
newnode->par=Node[par];
}
newnode->prority=newnode->par->child.size()-1;
}
//travel_tree(root);
while(m--)
{
string cmd;
cin>>cmd;
if(cmd=="Check")
{
checktree(root);
cout<<"Maximum Value: "<<max_sum<<endl;
cout<<"Root of the Path: "<<max_node<<endl;
max_sum=-(int)1e9;
}
else if(cmd=="Add")
{
int par,val,dis;
cin>>par>>val>>dis;
node* newnode;
//cout<<"Add"<<endl;
if(Node[val]==NULL)
{
newnode=createnode();
newnode->dis=dis;
newnode->val=val;
Node[val]=newnode;
}
else
{
newnode=Node[val];
newnode->val=val;
newnode->dis=dis;
}
//cout<<"child"<<endl;
if(Node[par]==NULL)
{
node* parentnode=createnode();
parentnode->child.emplace_back(newnode);
newnode->par=parentnode;
parentnode->val=par;
Node[par]=parentnode;
}
else
{
Node[par]->child.emplace_back(newnode);
newnode->par=Node[par];
}
//cout<<"parent"<<endl;
newnode->prority=newnode->par->child.size()-1;
}
else
{
int deletenode;
cin>>deletenode;
if(Node[deletenode]!=NULL)
{
//cout<<"deletenode"<<endl;
for(auto it=Node[deletenode]->par->child.begin();it!=Node[deletenode]->par->child.end();it++)
{
//cout<<(*it)->val<<endl;
if((*it)->val==Node[deletenode]->val)
{
for(auto it2=next(it);it2!=Node[deletenode]->par->child.end();it2++)
{
(*it2)->prority--;
}
Node[deletenode]->par->child.erase(it);
break;
}
}
//cout<<"here"<<endl;
for(int i=0;i<Node[deletenode]->child.size();i++)
{
Node[deletenode]->par->child.emplace_back(Node[deletenode]->child[i]);
Node[deletenode]->child[i]->prority=Node[deletenode]->par->child.size()-1;
Node[deletenode]->child[i]->par=Node[deletenode]->par;
}
sort(Node[deletenode]->par->child.begin(),Node[deletenode]->par->child.end(),cmp);
free(Node[deletenode]);
Node[deletenode]=NULL;
}
}
//travel_tree(root);
}
checktree(root);
//cout<<"Maximum Value: "<<max_sum<<endl;
cout<<"Final Root: "<<max_node<<endl;
//cout<<maximum<<endl;
}
signed main(void)
{
cin.tie(NULL),cout.tie(NULL);
ios::sync_with_stdio(0);
solve();
}