/*
这道题的思路很简单就是,就是先把ip地址转成二进制,
然后比较二进制的共同前缀,
最后根据共同前缀计算子网掩码即可
本质上的功能就是把十进制的string和二进制的string的相互转换
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<string>
#include<strstream>
#include<strstream>
#include <sstream>
using namespace std;
//int转成string
string itod(int i){
stringstream ss;
ss<<i;
return ss.str();
}
//int转成二进制string
string itos(int i){
string s;
while(i){
s.push_back(i%2+'0');
i/=2;
}
while(s.size()<8)s.push_back('0');
reverse(s.begin(),s.end());
return s;
}
//把string类型的ip地址转换成二进制string
string stob(string s){
string ans;
string::size_type now=0,next=0;
while(now<s.size()){
next=s.find('.',now);
if(next==string::npos)next=s.size();
int num=stoi(s.substr(now,next-now));
ans+=itos(num);
now=next+1;
}
return ans;
}
//计算两个二进制ip地址串的共同前缀,pos是共同前缀长度
//这中间要注意一定要计算共同前缀长度,因为直接把本次共同前缀之后的ans赋值为0的话,
//下一次计算的ans和now的共同前缀时候,有可能now的pos之后部分为0.这样导致错误。
int comm(string &a,string &b,int len){
int pos=0;
while(pos<len&&a[pos]==b[pos])++pos;
return pos;
}
void ins(string &s){
int num;
string ans;
for(int i=0;i<4;++i){
if(i)ans.push_back('.');
num=stoi(s.substr(i*8,8),nullptr,2);
ans+=itod(num);
}
cout<<ans<<endl;
}
int main()
{
int m,len;
while(scanf("%d",&m)!=EOF&&m){
len=32;
string ans,now,tmp;
for(int i=0;i<m;++i){
cin>>tmp;
now=stob(tmp);
if(i==0)ans=now;
len=comm(ans,now,len);
}
for(int i=len;i<32;++i)ans[i]='0';
for(int i=0;i<32;++i)now[i]=i<len?'1':'0';
ins(ans);
ins(now);
}
return 0;
}