#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main()
{
int n,m,x;
cin>>n>>m>>x;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<m;i++) scanf("%d",&b[i]);
//题目这里已经保证为升序数列,如若没有可以用sort方法进行排序
//双指针算法
//这种写法的好处是,当a很小以至于加上b的最大值都无法达到x时,
//j是不动的,这给了后续a数组继续判断的机会,
//不会导致一直无法达到x值
//当然,如果j指针动了,则代表此处的a值与b值相加已经超过了x
//那么,后续的a值与此处的b值相加一定也超过x
//所以,此时j往前移动并不会导致无法取得x值的极端情况
for(int i=0,j=m-1;i<n;i++)
{
while(j>=0&&a[i]+b[j]>x) j--;
if(j>=0&&a[i]+b[j]==x) cout<<i<<" "<<j<<endl;
}
//这种写法存在一个问题,就是一开始a数组的值比较小可能导致
//b数组一直往后走,到一个很后的位置,此时b数组的值已经较大了
//此时a数组往后走,值增大,很可能导致a[i]+b[j]的和均大于x
/*
20 10 68
5 8 10 15 17 18 27 29 34 35 45 50 59 73 75 76 83 86 87 94
4 14 27 45 49 58 65 69 80 89
*/
/*for(int i=0,j=0;i<n;i++)
{
while(j<m&&a[i]+b[j]<x) j++;
if(j<m&&a[i]+b[j]==x) cout<<i<<" "<<j<<endl;
}*/
return 0;
}