#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
set<int> a[2];
int n,m,k,flag1[N],flag2[N];
char s1[N],s2[N];
void solve(int x,int y){
	int p0=*a[0].upper_bound(x),p1=*a[1].upper_bound(x);
	int p=min(p0,p1);
	if (x+k-y<p){
		p=x+k-y;
		a[0].insert(p);
		a[1].insert(p);
		return;
	}
	int v=p,t=p1==p;
	a[t^1].insert(v);
	while (a[t].find(v)!=a[t].end()){
		a[t].erase(v);
		v++;
	}
	if (a[t^1].find(v)!=a[t^1].end()){
		a[t^1].erase(v);
		solve(v,p-x+y);
	}
	else a[t].insert(v);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	scanf("%s",s1);
	scanf("%s",s2);
	reverse(s1,s1+n);
	reverse(s2,s2+m);
	for (int i=m;i<n;i++)s2[i]='0';
	for (int i=n;i<m;i++)s1[i]='0';
	n=max(n,m);
	a[0].insert(1e9);
	a[1].insert(1e9);
	for (int i=n-1;i>=0;i--)
		if (s1[i]=='1'&&s2[i]=='1')solve(i,0);
		else if (s1[i]=='1')a[0].insert(i);
		else if (s2[i]=='1')a[1].insert(i);
	int Max1=0,Max2=0;
	for (set<int>::iterator iter=a[0].begin();iter!=a[0].end();iter++)
		if ((*iter)!=1e9){
			Max1=max(Max1,*iter);
			flag1[*iter]=1;
		}
	for (set<int>::iterator iter=a[1].begin();iter!=a[1].end();iter++)
		if ((*iter)!=1e9){
			Max2=max(Max2,*iter);
			flag2[*iter]=1;
		}
	for (int i=Max1;i>=0;i--)printf("%d",flag1[i]);
	puts("");
	for (int i=Max2;i>=0;i--)printf("%d",flag2[i]);
	puts("");
}
