#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define long long long
class Graph{
long int v;
list<long int> *adj;
public:
Graph(long int v) : v(v){
adj = new list<long int>[v];
}
void addEdge(long int u, long int v){
adj[u].push_back(v);
adj[v].push_back(u);
}
long int findLastVertex(){
vector<long int> distance(v,LONG_MAX);
queue<long int> q;
distance[0] = 0;
q.push(0);
while(!q.empty()){
auto ele = q.front();
q.pop();
for(auto e : adj[ele]){
if(distance[e] == LONG_MAX){
distance[e] = distance[ele] + 1;
q.push(e);
}
}
}
// for(auto ele : distance)
// cout<<ele<<" ";
// cout<<endl;
return max_element(distance.begin(),distance.end()) - distance.begin();
}
long int findDiameter(long int lastVertex){
vector<long int> distance(v,LONG_MAX);
queue<long int> q;
distance[lastVertex] = 0;
q.push(lastVertex);
while(!q.empty()){
auto ele = q.front();
q.pop();
for(auto e : adj[ele]){
if(distance[e] == LONG_MAX){
distance[e] = distance[ele] + 1;
q.push(e);
}
}
}
return *max_element(distance.begin(),distance.end());
}
};
int main(){
IOS;
long int n;
cin>>n;
long int ans = 0;
while(n--){
long int v;
cin>>v;
Graph g(v);
for(long int i = 0; i < v-1; i++){
long int a,b;
cin>>a>>b;
g.addEdge(a-1,b-1);
}
// cout<<ans<<endl;
ans += g.findDiameter(g.findLastVertex());
}
cout<<ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIElPUyBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgbG9uZyBsb25nIGxvbmcgCgpjbGFzcyBHcmFwaHsKCWxvbmcgaW50IHY7CglsaXN0PGxvbmcgaW50PiAqYWRqOwoKCXB1YmxpYzoKCQlHcmFwaChsb25nIGludCB2KSA6IHYodil7CgkJCWFkaiA9IG5ldyBsaXN0PGxvbmcgaW50Plt2XTsKCQl9CgoJCXZvaWQgYWRkRWRnZShsb25nIGludCB1LCBsb25nIGludCB2KXsKCQkJYWRqW3VdLnB1c2hfYmFjayh2KTsKCQkJYWRqW3ZdLnB1c2hfYmFjayh1KTsKCQl9CgoJCWxvbmcgaW50IGZpbmRMYXN0VmVydGV4KCl7CgkJCXZlY3Rvcjxsb25nIGludD4gZGlzdGFuY2UodixMT05HX01BWCk7CgkJCXF1ZXVlPGxvbmcgaW50PiBxOwoJCQlkaXN0YW5jZVswXSA9IDA7CgkJCXEucHVzaCgwKTsKCgkJCXdoaWxlKCFxLmVtcHR5KCkpewoJCQkJYXV0byBlbGUgPSBxLmZyb250KCk7CgkJCQlxLnBvcCgpOwoKCQkJCWZvcihhdXRvIGUgOiBhZGpbZWxlXSl7CgkJCQkJaWYoZGlzdGFuY2VbZV0gPT0gTE9OR19NQVgpewoJCQkJCQlkaXN0YW5jZVtlXSA9IGRpc3RhbmNlW2VsZV0gKyAxOwoJCQkJCQlxLnB1c2goZSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCS8vIGZvcihhdXRvIGVsZSA6IGRpc3RhbmNlKQoJCQkvLyAJY291dDw8ZWxlPDwiICI7CgkJCS8vIGNvdXQ8PGVuZGw7CgkJCXJldHVybiBtYXhfZWxlbWVudChkaXN0YW5jZS5iZWdpbigpLGRpc3RhbmNlLmVuZCgpKSAtIGRpc3RhbmNlLmJlZ2luKCk7CgkJfQoKCQlsb25nIGludCBmaW5kRGlhbWV0ZXIobG9uZyBpbnQgbGFzdFZlcnRleCl7CgkJCXZlY3Rvcjxsb25nIGludD4gZGlzdGFuY2UodixMT05HX01BWCk7CgkJCXF1ZXVlPGxvbmcgaW50PiBxOwoJCQlkaXN0YW5jZVtsYXN0VmVydGV4XSA9IDA7CgkJCXEucHVzaChsYXN0VmVydGV4KTsKCgkJCXdoaWxlKCFxLmVtcHR5KCkpewoJCQkJYXV0byBlbGUgPSBxLmZyb250KCk7CgkJCQlxLnBvcCgpOwoKCQkJCWZvcihhdXRvIGUgOiBhZGpbZWxlXSl7CgkJCQkJaWYoZGlzdGFuY2VbZV0gPT0gTE9OR19NQVgpewoJCQkJCQlkaXN0YW5jZVtlXSA9IGRpc3RhbmNlW2VsZV0gKyAxOwoJCQkJCQlxLnB1c2goZSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAqbWF4X2VsZW1lbnQoZGlzdGFuY2UuYmVnaW4oKSxkaXN0YW5jZS5lbmQoKSk7CgkJfQp9OwoKaW50IG1haW4oKXsKICAgSU9TOwoKICAgbG9uZyBpbnQgbjsKICAgY2luPj5uOwoKICAgbG9uZyBpbnQgYW5zID0gMDsKCiAgIHdoaWxlKG4tLSl7CiAgIAlsb25nIGludCB2OwogICAJY2luPj52OwogICAJR3JhcGggZyh2KTsKCiAgIAlmb3IobG9uZyBpbnQgaSA9IDA7IGkgPCB2LTE7IGkrKyl7CiAgIAkJbG9uZyBpbnQgYSxiOwogICAJCWNpbj4+YT4+YjsKICAgCQlnLmFkZEVkZ2UoYS0xLGItMSk7CiAgIAl9CiAgIAkvLyBjb3V0PDxhbnM8PGVuZGw7CiAgIAlhbnMgKz0gZy5maW5kRGlhbWV0ZXIoZy5maW5kTGFzdFZlcnRleCgpKTsKICAgfQogICBjb3V0PDxhbnM7CiAgIHJldHVybiAwOwp9