/*
hdu2594
给你两个字符串a与b,求a的前缀与b的前缀相同的最长长度。
可以马上联想到MP算法中的f数组,其中f[i]正是s[0...i]中前缀与后缀相同的最长长度
把两个字符串连在一起,
中间加了一个特殊符号#,这样保证前缀与后缀不会跨越两个字符串
多组数据,需要每次将f清零,不然WA
Authur:lcy
Time:2017-9-28
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
using namespace std;
const int MAXN=50005<<1;
char s[MAXN];
int f[MAXN];
void get_fail(){
int l=strlen(s);
f[0]=0;
fr(i,1,l-1){
int j=f[i-1];
while(j&&s[j]!=s[i])j=f[j-1];
if(s[j]==s[i])
f[i]=j+1;
}
}
int main(){
while(fgets(s,MAXN,stdin)){
ms(f,0);
int l=strlen(s);s[l-1]='#';
fgets(s+l,MAXN,stdin);
l=strlen(s);s[l-1]=0;l--;
//printf("s=%s,l=%d\n",s,strlen(s));
get_fail();
if(f[l-1]){
fr(i,0,f[l-1]-1)
printf("%c",s[i]);
printf(" %d\n",f[l-1]);
}
else
printf("0\n");
}
}