/*
Author:-Sarthak Taneja
saar2119@gmail.com
CSE 2nd year,MNNIT Allahabad
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair< int,int > ii;
typedef vector< ii > vii;
#define sfd(x) scanf("%d",&x)
#define sfs(x) scanf("%s",x)
#define sff(x) scanf("%lf",&x)
#define mod 1000000007
#define MAX 1000000
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define testcases scanf("%d",&t);while(t--)
#define ffor(a,b,c) for(a=b;a<c;a++)
#define rfor(a,b,c) for(a=b;a>=c;a--)
int parent[100005]; // for keeping immediate parent of a node
int P[100005][18]; // for keeping 2^j th parent of a node
int maxi[100005][18]; // for maximum length from node to its 2^j th parent
int mini[100005][18]; // for minimum length from node to its 2^j th parent
int level[100005]; // for assigning levels to the node taking 1 as the root always
int root=1;
bool visited[100005]={0};
vector< pair<int,int> > graph[100005];
void setLevels(int node, int l,int dist)
{
level[node]=l;
visited[node]=1;
if(dist != -1)
{
maxi[node][0] = mini[node][0] = dist;
}
for(int i=0;i<graph[node].size();i++)
{
if(!visited[graph[node][i].fr])
{
parent[graph[node][i].fr] = node; // setting parent of a node
setLevels(graph[node][i].fr, l+1, graph[node][i].sc);
}
}
}
int lca(int p, int q)
{
int tmp,lg,i;
if(level[p] < level[q]) // if p is above in level then p is swapped with q
tmp=p, p=q, q=tmp;
for(lg=1; (1<<lg) <= level[p]; lg++);
lg--;
for(i=lg;i>=0;i--) //bringing p and q to the same levels
{
if(level[p] - (1<<i) >= level[q])
{
p=P[p][i];
}
}
if(p == q)
return p;
for(i=lg;i>=0;i--) // finding lca of p and q by jumping both p and q
{
if(P[p][i] != -1 && P[p][i] != P[q][i])
p=P[p][i], q=P[q][i];
}
return parent[p];
}
ii cal(int a,int b) //function to calculate the pair of maximum and minimum from a to its 2^j th parent b using a log(n) loop
{
ii pp;
int lg,i;
pp.fr=INT_MIN;
pp.sc=INT_MAX;
for(lg=1; (1<<lg) <= level[a]; lg++);
lg--;
for(i=lg;i>=0;i--)
{
if(level[a] - (1<<i) >= level[b])
{
pp.fr = max(pp.fr, maxi[a][i]);
pp.sc = min(pp.sc, mini[a][i]);
a=P[a][i];
}
}
return pp;
}
int main()
{
int i,j,t;
int n;
int u,v,w;
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
graph[i].clear();
visited[i]=0;
}
for(i=0;i<n-1;i++)
{
scanf("%d%d%d",&u,&v,&w);
graph[u].pb(mp(v,w));
graph[v].pb(mp(u,w));
}
root=1;
parent[1]=-1;
for(i=1;i<=n;i++)
{
for(j=0;j<18;j++)
{
P[i][j]=-1;
maxi[i][j] = INT_MIN;
mini[i][j] = INT_MAX;
}
}
setLevels(root,0,-1);
for(i=1;i<=n;i++)
{
P[i][0]=parent[i];
}
for(j=1;(1<<j)<=n;j++) // dynamic programming loop to assign values of 2^j th parent and maximum and minimum length upto them
{
for(i=1;i<=n;i++)
{
if(P[i][j-1] != -1)
{
P[i][j] = P[P[i][j-1]][j-1];
maxi[i][j] = max( maxi[i][j-1], maxi[P[i][j-1]][j-1]);
mini[i][j] = min( mini[i][j-1], mini[P[i][j-1]][j-1]);
}
}
}
int a,b,k;
ii pp;
ii qq;
sfd(k);
while(k--)
{
scanf("%d%d",&a,&b);
int lc=lca(a,b); //finding lca of a,b
if(lc == a)
{
pp=cal(b,lc);
printf("%d %d\n", pp.sc, pp.fr);
}
else if(lc == b)
{
pp=cal(a,lc);
printf("%d %d\n", pp.sc, pp.fr);
}
else
{
pp=cal(a,lc);
qq=cal(b,lc);
pp.fr= max(pp.fr, qq.fr);
pp.sc= min(pp.sc, qq.sc);
printf("%d %d\n", pp.sc, pp.fr);
}
//that's it if you have any doubt you can ask it in the comments on http://stackoverflow.com/questions/36083410/how-to-solve-spoj-disquery
}
}
return 0;
}
LyoKICAgIEF1dGhvcjotU2FydGhhayBUYW5lamEKICAgIHNhYXIyMTE5QGdtYWlsLmNvbQogICAgQ1NFIDJuZCB5ZWFyLE1OTklUIEFsbGFoYWJhZAoqLwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBwYWlyPCBpbnQsaW50ID4gaWk7CnR5cGVkZWYgdmVjdG9yPCBpaSA+IHZpaTsKCiNkZWZpbmUgc2ZkKHgpIHNjYW5mKCIlZCIsJngpCiNkZWZpbmUgc2ZzKHgpIHNjYW5mKCIlcyIseCkKI2RlZmluZSBzZmYoeCkgc2NhbmYoIiVsZiIsJngpCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKI2RlZmluZSBNQVggMTAwMDAwMAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGZyIGZpcnN0IAojZGVmaW5lIHNjIHNlY29uZAojZGVmaW5lIHRlc3RjYXNlcyBzY2FuZigiJWQiLCZ0KTt3aGlsZSh0LS0pCiNkZWZpbmUgZmZvcihhLGIsYykgZm9yKGE9YjthPGM7YSsrKQojZGVmaW5lIHJmb3IoYSxiLGMpIGZvcihhPWI7YT49YzthLS0pCgppbnQgcGFyZW50WzEwMDAwNV07IC8vIGZvciBrZWVwaW5nIGltbWVkaWF0ZSBwYXJlbnQgb2YgYSBub2RlCmludCBQWzEwMDAwNV1bMThdOyAvLyBmb3Iga2VlcGluZyAyXmogdGggcGFyZW50IG9mIGEgbm9kZQppbnQgbWF4aVsxMDAwMDVdWzE4XTsgLy8gZm9yIG1heGltdW0gbGVuZ3RoIGZyb20gbm9kZSB0byBpdHMgMl5qIHRoIHBhcmVudAppbnQgbWluaVsxMDAwMDVdWzE4XTsgLy8gZm9yIG1pbmltdW0gbGVuZ3RoIGZyb20gbm9kZSB0byBpdHMgMl5qIHRoIHBhcmVudAppbnQgbGV2ZWxbMTAwMDA1XTsgLy8gZm9yIGFzc2lnbmluZyBsZXZlbHMgdG8gdGhlIG5vZGUgdGFraW5nIDEgYXMgdGhlIHJvb3QgYWx3YXlzCmludCByb290PTE7CmJvb2wgdmlzaXRlZFsxMDAwMDVdPXswfTsgCnZlY3RvcjwgcGFpcjxpbnQsaW50PiA+IGdyYXBoWzEwMDAwNV07Cgp2b2lkIHNldExldmVscyhpbnQgbm9kZSwgaW50IGwsaW50IGRpc3QpCnsKCWxldmVsW25vZGVdPWw7Cgl2aXNpdGVkW25vZGVdPTE7CglpZihkaXN0ICE9IC0xKQoJewoJCW1heGlbbm9kZV1bMF0gPSBtaW5pW25vZGVdWzBdID0gZGlzdDsgCgl9Cglmb3IoaW50IGk9MDtpPGdyYXBoW25vZGVdLnNpemUoKTtpKyspCgl7CgkJaWYoIXZpc2l0ZWRbZ3JhcGhbbm9kZV1baV0uZnJdKQoJCXsKCQkJcGFyZW50W2dyYXBoW25vZGVdW2ldLmZyXSA9IG5vZGU7IC8vIHNldHRpbmcgcGFyZW50IG9mIGEgbm9kZQoJCQlzZXRMZXZlbHMoZ3JhcGhbbm9kZV1baV0uZnIsIGwrMSwgZ3JhcGhbbm9kZV1baV0uc2MpOwoJCX0KCX0KfQoKaW50IGxjYShpbnQgcCwgaW50IHEpCnsKCWludCB0bXAsbGcsaTsKCglpZihsZXZlbFtwXSA8IGxldmVsW3FdKSAvLyBpZiBwIGlzIGFib3ZlIGluIGxldmVsIHRoZW4gcCBpcyBzd2FwcGVkIHdpdGggcQoJCXRtcD1wLCBwPXEsIHE9dG1wOwoKCWZvcihsZz0xOyAoMTw8bGcpIDw9IGxldmVsW3BdOyBsZysrKTsKCWxnLS07CgkKCWZvcihpPWxnO2k+PTA7aS0tKSAvL2JyaW5naW5nIHAgYW5kIHEgdG8gdGhlIHNhbWUgbGV2ZWxzIAoJewoJCWlmKGxldmVsW3BdIC0gKDE8PGkpID49IGxldmVsW3FdKQoJCXsKCQkJcD1QW3BdW2ldOwoJCX0KCX0KCglpZihwID09IHEpCgkJcmV0dXJuIHA7CgoJZm9yKGk9bGc7aT49MDtpLS0pIC8vIGZpbmRpbmcgbGNhIG9mIHAgYW5kIHEgYnkganVtcGluZyBib3RoIHAgYW5kIHEKCXsKCQlpZihQW3BdW2ldICE9IC0xICYmIFBbcF1baV0gIT0gUFtxXVtpXSkKCQkJcD1QW3BdW2ldLCBxPVBbcV1baV07Cgl9CgoJcmV0dXJuIHBhcmVudFtwXTsKfQoKaWkgY2FsKGludCBhLGludCBiKSAvL2Z1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcGFpciBvZiBtYXhpbXVtIGFuZCBtaW5pbXVtIGZyb20gYSB0byBpdHMgMl5qIHRoIHBhcmVudCBiIHVzaW5nIGEgbG9nKG4pIGxvb3AgCnsKCWlpIHBwOwoJaW50IGxnLGk7CglwcC5mcj1JTlRfTUlOOwoJcHAuc2M9SU5UX01BWDsKCglmb3IobGc9MTsgKDE8PGxnKSA8PSBsZXZlbFthXTsgbGcrKyk7CglsZy0tOwoJCglmb3IoaT1sZztpPj0wO2ktLSkKCXsKCQlpZihsZXZlbFthXSAtICgxPDxpKSA+PSBsZXZlbFtiXSkKCQl7CgkJCXBwLmZyID0gbWF4KHBwLmZyLCBtYXhpW2FdW2ldKTsKCQkJcHAuc2MgPSBtaW4ocHAuc2MsIG1pbmlbYV1baV0pOwoJCQlhPVBbYV1baV07CgkJfQoJfQoKCXJldHVybiBwcDsKfQoKaW50IG1haW4oKQp7CglpbnQgaSxqLHQ7CglpbnQgbjsKCWludCB1LHYsdzsKCgl7CgkJc2NhbmYoIiVkIiwmbik7CgoJCWZvcihpPTE7aTw9bjtpKyspCgkJewoJCQlncmFwaFtpXS5jbGVhcigpOwoJCQl2aXNpdGVkW2ldPTA7CgkJfQoKCQlmb3IoaT0wO2k8bi0xO2krKykKCQl7CgkJCXNjYW5mKCIlZCVkJWQiLCZ1LCZ2LCZ3KTsKCQkJZ3JhcGhbdV0ucGIobXAodix3KSk7CgkJCWdyYXBoW3ZdLnBiKG1wKHUsdykpOwoJCX0KCQlyb290PTE7CgkJcGFyZW50WzFdPS0xOwoKCQlmb3IoaT0xO2k8PW47aSsrKQoJCXsKCQkJZm9yKGo9MDtqPDE4O2orKykKCQkJewoJCQkJUFtpXVtqXT0tMTsKCQkJCW1heGlbaV1bal0gPSBJTlRfTUlOOwoJCQkJbWluaVtpXVtqXSA9IElOVF9NQVg7CgkJCX0KCQl9CgoJCXNldExldmVscyhyb290LDAsLTEpOwoKCQlmb3IoaT0xO2k8PW47aSsrKQoJCXsKCQkJUFtpXVswXT1wYXJlbnRbaV07CgkJfQoKCQlmb3Ioaj0xOygxPDxqKTw9bjtqKyspIC8vIGR5bmFtaWMgcHJvZ3JhbW1pbmcgbG9vcCB0byBhc3NpZ24gdmFsdWVzIG9mIDJeaiB0aCBwYXJlbnQgYW5kIG1heGltdW0gYW5kIG1pbmltdW0gbGVuZ3RoIHVwdG8gdGhlbQoJCXsKCQkJZm9yKGk9MTtpPD1uO2krKykKCQkJewoJCQkJaWYoUFtpXVtqLTFdICE9IC0xKQoJCQkJewoJCQkJCVBbaV1bal0gPSBQW1BbaV1bai0xXV1bai0xXTsKCQkJCQltYXhpW2ldW2pdID0gbWF4KCBtYXhpW2ldW2otMV0sIG1heGlbUFtpXVtqLTFdXVtqLTFdKTsKCQkJCQltaW5pW2ldW2pdID0gbWluKCBtaW5pW2ldW2otMV0sIG1pbmlbUFtpXVtqLTFdXVtqLTFdKTsKCQkJCX0KCQkJfQoJCX0KCgkJaW50IGEsYixrOwoJCWlpIHBwOwoJCWlpIHFxOwoJCXNmZChrKTsKCQl3aGlsZShrLS0pCgkJewoJCQlzY2FuZigiJWQlZCIsJmEsJmIpOwoJCQlpbnQgbGM9bGNhKGEsYik7IC8vZmluZGluZyBsY2Egb2YgYSxiCgoJCQlpZihsYyA9PSBhKQoJCQl7CgkJCQlwcD1jYWwoYixsYyk7CgoJCQkJcHJpbnRmKCIlZCAlZFxuIiwgcHAuc2MsIHBwLmZyKTsKCQkJfQoJCQllbHNlIGlmKGxjID09IGIpCgkJCXsKCQkJCXBwPWNhbChhLGxjKTsKCQkJCXByaW50ZigiJWQgJWRcbiIsIHBwLnNjLCBwcC5mcik7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwcD1jYWwoYSxsYyk7CgkJCQlxcT1jYWwoYixsYyk7CgkJCQlwcC5mcj0gbWF4KHBwLmZyLCBxcS5mcik7CgkJCQlwcC5zYz0gbWluKHBwLnNjLCBxcS5zYyk7CgkJCQlwcmludGYoIiVkICVkXG4iLCBwcC5zYywgcHAuZnIpOwoJCQl9CgkJCS8vdGhhdCdzIGl0IGlmIHlvdSBoYXZlIGFueSBkb3VidCB5b3UgY2FuIGFzayBpdCBpbiB0aGUgY29tbWVudHMgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNjA4MzQxMC9ob3ctdG8tc29sdmUtc3Bvai1kaXNxdWVyeQoJCX0KCX0KCXJldHVybiAwOwp9