#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
int read()
{
	char c=getchar();
	int res=0;
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') res=(res<<1)+(res<<3)+(c^48),c=getchar();
	return res;
}
int n,m,k,tail,tot,a[2000005],b[2000005],na[2000005],nb[2000005];
char s[2000005],t[2000005];
struct node
{
	int v,pos;
}sta[2000005],tmp[2000005];
int main()
{
	n=read(),m=read(),k=read();
	scanf("%s",s+1);scanf("%s",t+1);
	reverse(s+1,s+n+1);reverse(t+1,t+m+1);
	for(int i=1;i<=n;i++) na[i]=s[i]-'0';
	for(int i=1;i<=m;i++) nb[i]=t[i]-'0';
	int T=max(n,m);
	for(int i=T;i>=1;i--)
	{
		int x=(na[i]<<1)|nb[i],num=k,now=i;
		if(x==3)
		{
			tot=0;
			while(tail)
			{
				if(x==3)
				{
					if(num>=sta[tail].pos-now)
					{
						num-=sta[tail].pos-now;
						now=sta[tail].pos;
						tmp[++tot]=(node){x^sta[tail].v,now};
						x=x&sta[tail].v;
					}
					else break;
				}
				else if(x)
				{
					if(sta[tail].pos==now+1)
					{
						now=sta[tail].pos;
						if(x^sta[tail].v) x=3;
						else x=x&sta[tail].v;
					}
					else break;
				}
				else break;
				tail--;
			}
			if(x!=0&&x!=3)
			{
				now++;
				tmp[++tot]=(node){x,now};
			}
			else if(x)
			{
				now+=num;
				a[now]=b[now]=1;
			}
			for(int i=tot;i>=1;i--) sta[++tail]=tmp[i];
		}
		else if(x) sta[++tail]=(node){x,i};
	}
	for(int i=1;i<=tail;i++)
	{
		int x=sta[i].pos;
		a[x]=sta[i].v>>1;b[x]=sta[i].v&1;
	}
	T=n+k;
	while(!a[T]) T--;
	for(int i=T;i>=1;i--) printf("%d",a[i]);
	puts("");
	T=m+k;
	while(!b[T]) T--;
	for(int i=T;i>=1;i--) printf("%d",b[i]);
}