#include<bits/stdc++.h>
using namespace std;
int n;


set<int> t[10];
vector<int> a[10];

map< vector<int> , vector<int> >mp;

void calc(vector<int> a,int id){
  a[2]=(a[2]-a[0]+60)%60;
  a[1]=(a[1]-a[0]+60)%60;
  a[0]=0;
 
  vector<int> &G = mp[a];
  for(int i=0;i<(int)G.size();i++){
    t[id].insert(G[i]);

  }
}

int main(){
  vector<int> tmp(3),copy;
  
  for(int i=0;i<12;i++){
    for(int j=0;j<60;j++){
      for(int k=0;k<60;k++){
        int I=i*5+j/12;
        tmp[0]=I,tmp[1]=j,tmp[2]=k;
        sort(tmp.begin(),tmp.end());
        tmp[2]-=tmp[0];
        tmp[1]-=tmp[0];
        tmp[0]=0;
        mp[tmp].push_back(i*3600+j*60+k);
      }
    }
  }
  
  while(1){
    cin>>n;
    if(n==0)break;

    for(int i=0;i<n;i++){
      t[i].clear();
      t[i].insert(1e9);
      a[i].resize(3);
      for(int j=0;j<3;j++)cin>>a[i][j];
      sort(a[i].begin(),a[i].end());
      do
        calc(a[i],i);
      while(next_permutation(a[i].begin(),a[i].end()));
    }

    int ans=60*60*12,l,r;
    for(int i=0;i<60*60*12;i++){
      int maxm=i,mini=i;
      for(int j=0;j<n;j++){
        maxm=max(maxm, *t[j].lower_bound(i));
        mini=min(mini, *t[j].lower_bound(i));
      }
   
      if(ans>maxm-mini){
        ans=maxm-mini;
        l=mini;
        r=maxm;
      }
    }
   
    printf("%02d:%02d:%02d %02d:%02d:%02d\n",l/3600,l/60%60,l%60,r/3600,r/60%60,r%60);
  }
  return 0;
}