#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
//#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];;
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    int res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(int pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);

    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
int prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,k+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
        //de(l1),de(l2),de(p1),dee(p2);
        if(l2==0&&p1!=0) swap(l1,l2), swap(p1,p2);
        if(l1==0&&p2!=0){
            if(k<=p2) p1=1;
            else if(p2+2*k-1<=n) p1=p2+k;
            else continue;
            if(p1>p2) swap(p1,p2);
            return 0*printf("Yes\n%d %d\n",p1,p2);
        }
        else if(l2==0&&p1!=0){
            if(p1<=n-2*k) {
                printf("Yes\n%d %d\n",p1,p1+k);
                return 0;
            }
        }
    }
    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={951413,951413}, seed[2]={37,37};
LL  bas[2][maxn], hash_val[2][maxn];
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    LL res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-(hash_val[f][st-1]*bas[f][ed-st+1]%mod[f])+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);
    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) {
            pii ttt=getHash(l+k-spl,l+k-1);
            l++;
        }
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    rep(i,1,m+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
//#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    LL res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);

    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,min(k,m)+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
        if(l2==0&&p1!=0) swap(l1,l2), swap(p1,p2);
        if(l1==0&&p2!=0){
            if(k<=p2) p1=1;
            else if(p2+2*k-1<=n) p1=p2+k;
            else continue;
            if(p1>p2) swap(p1,p2);
            return 0*printf("Yes\n%d %d\n",p1,p2);
        }
    }
    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
LL f[maxn],g[maxn];
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
        //de(i),dee(bas[i]);
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0;
    //rep(len,1,last+1){
    //    if(Check(k-len+1,k,1,len)) pos[len]=k;
    //}
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l+k-1;
        spl++;
    }
}
void Solve1(int l,int r) {
    int pos=k;
    for(int i=l;i<=r;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
        f[i]=pos<=n?pos:0;
    }
}
void Solve2(int l,int r) {
    int pos=n-k+1;
    for(int i=r;i>=l;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
        g[i]=pos;
    }
}
bool Solve() {
    int pos=1;
    for(int i=1;i<=m;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
    }
    if(max(pos,k)+k<=n) {
        printf("Yes\n%d %d\n",max(1,pos-k+1),max(pos,k)+1);
        return 1;
    }
    pos=n;
    for(int i=m;i;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
    }
    if(n-max(n-pos+1,k)-k>0) {
        printf("Yes\n%d %d\n",n-max(n-pos+1,k)-k,n-max(n-pos+1,k)+1);
        return 1;
    }
    return 0;
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    if(m<=k&&Solve()) return 0;
    int lst=1,fst=1;
    /*
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            f[i]=k;
        }
    Solve1(lst+1,min(m,k));
    */
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            f[i]=k;
        }
    Solve1(lst+1,min(m,k));
    lst=fst=m;
    for(int i=m;i&&i>=m-k+1;i--)
        if(Check(n-k+1,n-k+1+m-i,i,m)) {
            lst=i;
            g[i]=n-k+1;
        }
    Solve2(max(1,m-k+1),lst-1);
    int x=0,y=0;
    for(int i=1;i<m;i++)
        if(f[i]&&g[i+1]&&f[i]<g[i+1]) {
            x=f[i]-k+1;y=g[i+1];
            break;
        }
    if(x) printf("Yes\n%d %d\n",x,y);else puts("No");
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];;
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    int res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(int pos[]){
    int l=1,spl=1;
    LL pre[2]={0},bak[2]={0};
    while(spl<=min(m,k)){
        l=1;
        rep(i,0,2){
            pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
            bak[i]=(bak[i]-t[spl]*bas[i][n-spl]+mod[i])%mod[i];
        }
        pii preh=mp(pre[0],pre[1]), bakh=mp(bak[0],bak[1]);
        while(l+k-1<=n&&getHash(l+(k-spl),l+k-1)!=preh) l++;
        if(l+k-1<=n) pos[spl]=l;
        spl++;
    }
}
int prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,k+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
        if(l1==0&&p2!=0){
            if(k<=p2) p1=k;
            else if(p2+2*k-1<=n) { p1=p2+k; swap(p1,p2); }
            else continue;
            { printf("Yes\n%d %d\n",p1,p2); return 0; }
        }
    }
    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn];
typedef pair<int,int> pii;
LL hash_val[2][maxn];
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    int res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(int pos[]){
    int l=1,spl=1;
    LL pre[2]={0},bak[2]={0};
    while(spl<=min(m-1,k)){
        rep(i,0,2){
            pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
            bak[i]=(bak[i]-t[spl]*bas[i][n-spl]+mod[i])%mod[i];
        }
        pii preh=mp(pre[0],pre[1]), bakh=mp(bak[0],bak[1]);
        while(l+k-1<=n&&getHash(l+(k-spl),l+k-1)!=preh) l++;
        if(l+spl-1<=n) pos[spl]=l;
        spl++;
    }
}
int prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);

    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
   // rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,k+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p1!=0&&p2!=n+1&&p2-p1>=k) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    LL res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);

    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,min(k,m)+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        //dee("in");
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    LL res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);

    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,min(k,m)+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<=1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
int f[maxn],g[maxn];
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
        //de(i),dee(bas[i]);
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0;
    rep(len,1,last+1){
        if(Check(k-len+1,k,1,len)) pos[len]=1;
    }
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
void Solve1(int l,int r) {
    int pos=k;
    for(int i=l;i<=r;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
        f[i]=pos<=n?pos:0;
    }
}
void Solve2(int l,int r) {
    int pos=n-k+1;
    for(int i=r;i>=l;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
        g[i]=pos;
    }
}
bool Solve() {
    int pos=1;
    for(int i=1;i<=m;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
    }
    if(max(pos,k)+k<=n) {
        printf("Yes\n%d %d\n",max(1,pos-k+1),max(pos,k)+1);
        return 1;
    }
    pos=n;
    for(int i=m;i;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
    }
    if(n-max(n-pos+1,k)-k>0) {
        printf("Yes\n%d %d\n",n-max(n-pos+1,k)-k,n-max(n-pos+1,k)+1);
        return 1;
    }
    return 0;
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    if(m<=k&&Solve()) return 0;
    int lst=1,fst=1;
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            f[i]=k;
        }
    Solve1(lst+1,min(m,k));
    lst=fst=m;
    for(int i=m;i&&i>=m-k+1;i--)
        if(Check(n-k+1,n-k+1+m-i,i,m)) {
            lst=i;
            g[i]=n-k+1;
        }
    Solve2(max(1,m-k+1),lst-1);
    int x=0,y=0;
    for(int i=1;i<m;i++)
        if(f[i]&&g[i+1]&&f[i]<g[i+1]) {
            x=f[i]-k+1;y=g[i+1];
            break;
        }
    if(x) printf("Yes\n%d %d\n",x,y);else puts("No");
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
        //de(i),dee(bas[i]);
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0, start=1;
    rep(len,1,last+1){
        if(Check(k-len+1,k,1,len)) pos[len]=1,start=len;
    }
    spl=start+1;
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(prepos);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    rep(i,1,m+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0, start=1;
    rep(len,1,last+1){
        if(Check(k-len+1,k,1,len)) pos[len]=1,start=len;
    }
    /*
    12 5 4
    aadbbdcccdaa
    dbbcd
    */
    ///spl=start+1;
    while(spl<=start){
        //pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
    l=1;
    while(spl<=last){
        //pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(prepos);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    rep(i,1,m+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
LL f[maxn],g[maxn];
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
        //de(i),dee(bas[i]);
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0;
    //rep(len,1,last+1){
    //    if(Check(k-len+1,k,1,len)) pos[len]=k;
    //}
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l+k-1;
        spl++;
    }
}
void Solve1(int l,int r) {
    int pos=k;
    for(int i=l;i<=r;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
        f[i]=pos<=n?pos:0;
    }
}
void Solve2(int l,int r) {
    int pos=n-k+1;
    for(int i=r;i>=l;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
        g[i]=pos;
    }
}
bool Solve() {
    int pos=1;
    for(int i=1;i<=m;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
    }
    if(max(pos,k)+k<=n) {
        printf("Yes\n%d %d\n",max(1,pos-k+1),max(pos,k)+1);
        return 1;
    }
    pos=n;
    for(int i=m;i;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
    }
    if(n-max(n-pos+1,k)-k>0) {
        printf("Yes\n%d %d\n",n-max(n-pos+1,k)-k,n-max(n-pos+1,k)+1);
        return 1;
    }
    return 0;
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    if(m<=k&&Solve()) return 0;
    int lst=1,fst=1;
    /*
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            f[i]=k;
        }
    Solve1(lst+1,min(m,k));
    */
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            f[i]=k;
        }
    solve(f);
    lst=fst=m;
    for(int i=m;i&&i>=m-k+1;i--)
        if(Check(n-k+1,n-k+1+m-i,i,m)) {
            lst=i;
            g[i]=n-k+1;
        }
    Solve2(max(1,m-k+1),lst-1);
    int x=0,y=0;
    for(int i=1;i<m;i++)
        if(f[i]&&g[i+1]&&f[i]<g[i+1]) {
            x=f[i]-k+1;y=g[i+1];
            break;
        }
    if(x) printf("Yes\n%d %d\n",x,y);else puts("No");
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0, start=1;
    rep(len,1,last+1){
        if(Check(k-len+1,k,1,len)) pos[len]=1,start=len;
    }
    /*
    12 5 4
    aadbbdcccdaa
    dbbcd
    */
    spl=start+1;
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(prepos);
    rep(i,1,m+1) de(i),dee(prepos[i]);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    rep(i,1,m+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include<bits/stdc++.h>
using namespace std;
const int N=500010;
const int H=37;
const int P=1000000007;
int k,n,m;
int pos;
int f[N],g[N];
int hs[N],ht[N],p[N];
int x,y;
char s[N],t[N];
bool Check(int l,int r,int L,int R) {
    int t=(hs[r]-1ll*hs[l-1]*p[r-l+1])%P;
    t=(t+P)%P;
    int T=(ht[R]-1ll*ht[L-1]*p[R-L+1])%P;
    T=(T+P)%P;
    return t==T;
}
bool Solve() {
    pos=1;
    for(int i=1;i<=m;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
    }
    if(max(pos,k)+k<=n) {
        printf("Yes\n%d %d\n",max(1,pos-k+1),max(pos,k)+1);
        return 1;
    }
    pos=n;
    for(int i=m;i;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
    }
    if(n-max(n-pos+1,k)-k>0) {
        printf("Yes\n%d %d\n",n-max(n-pos+1,k)-k,n-max(n-pos+1,k)+1);
        return 1;
    }
    return 0;
}
void Solve1(int l,int r) {
    int pos=k;
    for(int i=l;i<=r;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
        f[i]=pos<=n?pos:0;
    }
}
void Solve2(int l,int r) {
    int pos=n-k+1;
    for(int i=r;i>=l;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
        g[i]=pos;
    }
}
int main() {
    scanf("%d%d%d",&n,&m,&k);
    scanf("%s%s",s+1,t+1);
    p[0]=1;
    for(int i=1;i<=n;i++) p[i]=1ll*p[i-1]*H%P;
    for(int i=1;i<=n;i++) hs[i]=(1ll*hs[i-1]*H+s[i]-'a')%P;
    for(int i=1;i<=m;i++) ht[i]=(1ll*ht[i-1]*H+t[i]-'a')%P;
    if(m<=k&&Solve()) return 0;
    int lst,fst; lst=fst=1;
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            //cout<<fst<<endl;
            //if(fst!=1) fst=i;
            f[i]=k;
        }
    Solve1(1,fst-1);Solve1(lst+1,min(m,k));
    lst=fst=m;
    for(int i=m;i&&i>=m-k+1;i--)
        if(Check(n-k+1,n-k+1+m-i,i,m)) {
            lst=i;
            //if(fst!=m) fst=i;
            g[i]=n-k+1;
        }
    Solve2(fst+1,m);Solve2(max(1,m-k+1),lst-1);
    for(int i=1;i<m;i++)
        if(f[i]&&g[i+1]&&f[i]<g[i+1]) {
            x=f[i]-k+1;y=g[i+1];
            break;
        }
    if(x) printf("Yes\n%d %d\n",x,y);else puts("No");
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<LL,LL> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL seed=131,mod=1000000007;
LL  bas[maxn], hs[maxn],ht[maxn];
int n,k,m;
void Hash(char *s,int st,int ed,LL val[]){
    bas[0]=1;
    for(int i=st;i<=ed;++i){
        val[i]=(val[i-1]*seed+s[i])%mod;
        bas[i]=bas[i-1]*seed%mod;
    }
}
LL getHash(int st,int ed,LL hash_val[]){
    LL res=(hash_val[ed]-(hash_val[st-1]*bas[ed-st+1]%mod)+mod)%mod;
    return res;
}
bool Check(int sl,int sr,int tl,int tr){
    return getHash(sl,sr,hs)==getHash(tl,tr,ht);
}
void solve(LL pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre=0, start=1;
    rep(len,1,last+1){
        if(Check(k-len+1,k,1,len)) pos[len]=1,start=len;
    }
    /*
    12 5 4
    aadbbdcccdaa
    dbbcd
    */
    spl=start+1;
    while(spl<=last){
        pre=(pre*seed+t[spl])%mod;
        while(l+k-1<=n&&!Check(l+k-spl,l+k-1,1,spl)) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
LL prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(prepos);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,hs);  Hash(t,1,m,ht);
    solve(bakpos);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    rep(i,1,m+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
    }
    if(prepos[m]||bakpos[m]) {
        int p=prepos[m]?prepos[m]:bakpos[m];
        int p2=p-k;
        while(p2<1) p++,p2++;
        printf("Yes\n%d %d\n",p2,p);
        return 0;
    }

    return puts("No")*0;
}


#include <bits/stdc++.h>
using namespace std;
#define eps 1e-7
#define PI acos(-1)
//#define de(x) cout<<#x<<'='<<x<<" , "
#define dee(x) cout<<#x<<'='<<x<<endl
#define sz(x) (int)x.size()
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=a;i>(b);--i)
#define mset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=500055;
char s[maxn],t[maxn];
const LL mod[2]={1000000009,1000000007}, seed[2]={31,131};
LL  bas[2][maxn], hash_val[2][maxn];;
int n,k,m;
pii Hash(char *s,int st,int ed,bool f){
    LL h[2]={0,0}; bas[1][0]=bas[0][0]=1;
    for(int i=st;i<=ed;++i){
        rep(st,0,2) h[st]=(h[st]*seed[st]+s[i])%mod[st];
        if(f) rep(st,0,2) hash_val[st][i]=h[st];
        if(f) rep(st,0,2) bas[st][i]=bas[st][i-1]*seed[st]%mod[st];
    }
    return mp(h[0],h[1]);
}
pii getHash(int st,int ed){
    int res[2]={0,0};
    rep(f,0,2)
        res[f]=(hash_val[f][ed]-hash_val[f][st-1]*bas[f][ed-st+1]%mod[f]+mod[f])%mod[f];
    return mp(res[0],res[1]);
}

void solve(int pos[]){
    int l=1,spl=1, last=min(m,k);
    LL pre[2]={0};

    rep(len,1,last+1){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[len])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        if(getHash(k-len+1,k)==preh) pos[len]=1;
    }
    mset(pre,0);

    while(spl<=last){
        rep(i,0,2) pre[i]=(pre[i]*seed[i]+t[spl])%mod[i];
        pii preh=mp(pre[0],pre[1]);
        while(l+k-1<=n&&getHash(l+k-spl,l+k-1)!=preh) l++;
        if(l+k-1<=n&&(pos[spl]==0||pos[spl]>l)) pos[spl]=l;
        spl++;
    }
}
int prepos[maxn], bakpos[maxn];
int main(){
    //freopen("in.in","r",stdin);
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s %s",s+1,t+1);
    Hash(s,1,n,1);  solve(prepos);
    reverse(s+1,s+1+n); reverse(t+1,t+1+m);
    Hash(s,1,n,1);  solve(bakpos);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,1,m+1) if(bakpos[i]) bakpos[i]=n+1-(bakpos[i]+k-1);
    //rep(i,1,m+1) de(i),dee(prepos[i]);
    //rep(i,1,m+1) de(i),dee(bakpos[i]);
    rep(i,0,min(k,m)+1){
        int l1=i, l2=m-i, p1=prepos[l1], p2=bakpos[l2];
        if(p2-p1>=k&&p1!=0&&p2!=0) { printf("Yes\n%d %d\n",p1,p2); return 0; }
        //de(l1),de(l2),de(p1),dee(p2);
        if(l2==0&&p1!=0) swap(l1,l2), swap(p1,p2);
        if(l1==0&&p2!=0){
            if(k<=p2) p1=1;
            else if(p2+2*k-1<=n) p1=p2+k;
            else continue;
            if(p1>p2) swap(p1,p2);
            return 0*printf("Yes\n%d %d\n",p1,p2);
        }
        else if(l2==0&&p1!=0){
            if(p1<=n-2*k) {
                printf("Yes\n%d %d\n",p1,p1+k);
                return 0;
            }
        }
    }
    return puts("No")*0;
}


#include<bits/stdc++.h>
using namespace std;
const int N=500010;
const int H=37;
const int P=1000000007;
int k,n,m;
int pos;
int f[N],g[N];
int hs[N],ht[N],p[N];
int x,y;
char s[N],t[N];
bool Check(int l,int r,int L,int R) {
    int t=(hs[r]-1ll*hs[l-1]*p[r-l+1])%P;
    t=(t+P)%P;
    int T=(ht[R]-1ll*ht[L-1]*p[R-L+1])%P;
    T=(T+P)%P;
    return t==T;
}
bool Solve() {
    pos=1;
    for(int i=1;i<=m;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
    }
    if(max(pos,k)+k<=n) {
        printf("Yes\n%d %d\n",max(1,pos-k+1),max(pos,k)+1);
        return 1;
    }
    pos=n;
    for(int i=m;i;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
    }
    if(n-max(n-pos+1,k)-k>0) {
        printf("Yes\n%d %d\n",n-max(n-pos+1,k)-k,n-max(n-pos+1,k)+1);
        return 1;
    }
    return 0;
}
void Solve1(int l,int r) {
    int pos=k;
    for(int i=l;i<=r;i++) {
        while(pos<i) ++pos;
        while(pos<=n) {
            if(Check(pos-i+1,pos,1,i)) break;
            ++pos;
        }
        f[i]=pos<=n?pos:0;
    }
}
void Solve2(int l,int r) {
    int pos=n-k+1;
    for(int i=r;i>=l;i--) {
        while(pos+m-i>n) --pos;
        while(pos) {
            if(Check(pos,pos+m-i,i,m)) break;
            --pos;
        }
        g[i]=pos;
    }
}
int main() {
    scanf("%d%d%d",&n,&m,&k);
    scanf("%s%s",s+1,t+1);
    p[0]=1;
    for(int i=1;i<=n;i++) p[i]=1ll*p[i-1]*H%P;
    for(int i=1;i<=n;i++) hs[i]=(1ll*hs[i-1]*H+s[i]-'a')%P;
    for(int i=1;i<=m;i++) ht[i]=(1ll*ht[i-1]*H+t[i]-'a')%P;
    if(m<=k&&Solve()) return 0;
    int lst,fst; lst=fst=1;
    for(int i=1;i<=m&&i<=k;i++)
        if(Check(k-i+1,k,1,i)) {
            lst=i;
            //cout<<fst<<endl;
            if(fst!=1) fst=i;
            f[i]=k;
        }
    Solve1(1,fst-1);Solve1(lst+1,min(m,k));
    lst=fst=m;
    for(int i=m;i&&i>=m-k+1;i--)
        if(Check(n-k+1,n-k+1+m-i,i,m)) {
            lst=i;
            if(fst!=m) fst=i;
            g[i]=n-k+1;
        }
    Solve2(fst+1,m);Solve2(max(1,m-k+1),lst-1);
    for(int i=1;i<m;i++)
        if(f[i]&&g[i+1]&&f[i]<g[i+1]) {
            x=f[i]-k+1;y=g[i+1];
            break;
        }
    if(x) printf("Yes\n%d %d\n",x,y);else puts("No");
    return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
		if(a[j]>=m)
		{
			puts("Yes");
			if(n-tt-tt>j) cout<<j+1<<' '<<j+tt+1<<endl;
			else cout<<n-tt-tt+1<<' '<<n-tt+1<<endl;
			return 0;
		}
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,min(m,tt)+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-(m-i)+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,m+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-(m-i)+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,m+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-i+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=m;i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=m;i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,m+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-i+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
		if(a[j]>=m&&tt>=m)
		{
			if(j-tt>=0)
			{
				puts("Yes");
				cout<<j-tt+1<<' '<<j+1<<endl;
				return 0;
			}
			if(j+tt+tt-1<n)
			{
				puts("Yes");
				cout<<j+1<<' '<<j+tt+1<<endl;
				return 0;
			}
		}
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,min(m,tt)+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-(m-i)+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;i++)
#define repn(i,n) for(int i=1;i<=n;i++)
#define LL long long
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mpr make_pair

using namespace std;

const LL MOD=1e9+7;

int n,n2=1,m,tt,z[1000010],a[500010],b[500010],lpos[500010],rpos[500010];
string s,t,sv;
set <int> st;
vector <pii> v;

void calcZ()
{
	int lb=0,ub=0;
	repn(i,s.size()-1)
	{
		if(s[i]!=s[0]) continue;
		if(i>ub)
		{
			int p=i;
			while(p<s.size()&&s[p]==s[p-i]) p++;
			lb=i;
			ub=p-1;
			z[i]=p-i;
		}
		else
		{
			int j=i-lb;
			if(j+z[j]-1<ub-lb) z[i]=z[j];
			else
			{
				int p=ub+1;
				while(p<s.size()&&s[p]==s[p-i]) p++;
				z[i]=p-i;
				lb=i;
				ub=p-1;
			}
		}
	}
}

int main()
{
	cin>>n>>m>>tt>>s>>t;
	while(n2<n) n2*=2;
	sv=s;
	s=t+s;
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++)
	{
		a[j]=z[i];
		v.pb(mpr(a[j],j));
	}
	reverse(sv.begin(),sv.end());
	reverse(t.begin(),t.end());
	s=t+sv;
	memset(z,0,sizeof(z));
	calcZ();
	for(int i=m,j=0;i<s.size();i++,j++) b[j]=z[i];
	reverse(b,b+n);
	sort(v.begin(),v.end());
	int cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(v[cur--].se);
		set <int>::iterator it=st.lower_bound(tt-i);
		if(it==st.end()) lpos[i]=-1;
		else lpos[i]=*it;
	}
	while(!st.empty()) st.erase(st.begin());
	v.clear();
	rep(i,n) v.pb(mpr(b[i],i));
	sort(v.begin(),v.end());
	cur=n-1;
	for(int i=min(m,tt);i>=0;i--)
	{
		while(cur>=0&&v[cur].fi>=i) st.insert(-v[cur--].se);
		set <int>::iterator it=st.lower_bound(-(n-1-(tt-i)));
		if(it==st.end()) rpos[i]=-1;
		else rpos[i]=-*it;
	}
	rep(i,min(m,tt)+1)
	{
		if(lpos[i]==-1||rpos[m-i]==-1||lpos[i]+i-1>=rpos[m-i]-(m-i)+1) continue;
		puts("Yes");
		cout<<lpos[i]-(tt-i)+1<<' '<<rpos[m-i]-(m-i)+2<<endl;
		return 0;
	}
	puts("No");
	return 0;
}


#pragma comment(linker, "/STACK:256000000")

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#include <memory.h>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <utility>
#include <algorithm>
#include <random>
#include <bitset>
#include <unordered_set>
#include <unordered_map>

using namespace std;

typedef long long int64;
typedef unsigned long long uint64;
typedef pair<int, int> pii;
typedef pair<int64, int64> pll;
typedef pair<int64, int> pli;
typedef pair<int, int64> pil;
const int INF = (int)(1e9 + 1e5);
const int64 LINF = (int64)(1e18);
const int64 MX = 100500;
const double EPS = 1e-9;
#define sq(x) ((x)*(x))
#define FAIL() (*(int*)(0))++
#define ASSERT(exp) {if (!(exp)) exit(0);}
#ifdef _MY_DEBUG
#define I64d lld
#endif
const int MOD = 1000000007;
const int ROOT = 700;
const int PRM_ROOT = 5;
const int LOG = 30;

const int MAXN = 1500000;

int n, m, k;
string s, t;
string s1, s2;
vector<int> pf1, pf2;
int l[MAXN], r[MAXN];
int p1 = -1, p2 = -1;
bool was[MAXN];

void prefix_function(string& s, vector<int>& pf, int k)
{
    pf.assign(s.size(), 0);
    for (int i = 1; i < s.size(); ++i)
    {
        int j = pf[i - 1];
        while (j > 0 && s[i] != s[j])
        {
            j = pf[j - 1];
        }
        if (s[i] == s[j])
        {
            ++j;
        }
        pf[i] = j;
    }
    //cerr << pf[0] << " ";
    for (int i = 1; i < s.size(); ++i)
    {
        if (pf[i] > k)
        {
            pf[i] = pf[pf[i] - 1];
        }
        //cerr << pf[i] << " ";
        assert(pf[i] <= k);
    }
    //cerr << endl;
}

void init()
{
    cin >> n >> m >> k;
    cin >> s >> t;
}

void solve()
{
    s1 = t + "#" + s;
    s2 = s + "#" + t;
    reverse(s2.begin(), s2.end());
    prefix_function(s1, pf1, k);
    if (m <= k)
    {
        auto get_pos = [&](int i){
            return i + t.size() + 1;
        };
        for (int i = m - 1; i < s.size(); ++i)
        {
            int pos = get_pos(i);
            if (pf1[pos] == m)
            {
                p1 = i - m + 1;
                p2 = p1 + k;
                if (p2 + k > s.size())
                {
                    int d = p2 + k - s.size();
                    p1 -= d;
                    p2 -= d;
                }
                return;
            }
        }
    }
    prefix_function(s2, pf2, k);
    {
        memset(l, -1, sizeof(l));
        auto get_pos = [&](int i){
            return i + t.size() + 1;
        };
        for (int i = k - 1; i < s.size(); ++i)
        {
            int pos = get_pos(i);
            while (pos >= 0 && pf1[pos] >= 0 && l[pf1[pos]] == -1)
            {
                l[pf1[pos]] = i;
                pos = pf1[pos] - 1;
            }
        }
    }
    {
        memset(r, -1, sizeof(r));
        auto get_pos = [&](int i){
            return s.size() - i - 1 + t.size() + 1;
        };
        for (int i = s.size() - k; i >= 0; --i)
        {
            int pos = get_pos(i);
            while (pos >= 0 && pf2[pos] >= 0 && r[pf2[pos]] == -1)
            {
                r[pf2[pos]] = i;
                pos = pf2[pos] - 1;
            }
        }
    }
    for (int l_size = 1; l_size < m; ++l_size)
    {
        int r_size = m - l_size;
        if (l[l_size] != -1 && r[r_size] != -1 && l[l_size] < r[r_size])
        {
            p1 = l[l_size] - k + 1;
            p2 = r[r_size];
            return;
        }
    }
}

void print_answer()
{
    ++p1;
    ++p2;
    if (p1)
    {
        cout << "Yes\n" << p1 << " " << p2 << "\n";
    }
    else
    {
        cout << "No\n";
    }
}

void precalc()
{

}

void run()
{
#ifdef _MY_DEBUG
    freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout);
#endif // _MY_DEBUG
    precalc();
    int t = 1; //scanf ("%d", &t);
    for (int i = 0; i < t; ++i)
    {
        init();
        solve();
        print_answer();
    }
}
int main()
{
    srand(90);
    ios_base::sync_with_stdio(false); cin.tie(0);
    //test();
    run();
    return 0;
}


//https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 より
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};
    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };
    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };
    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };
    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };
    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

// ここまで

fn z_algorithm<T: Eq>(s: &[T]) -> Vec<usize> {
    let len = s.len();
    let mut a = vec![0; len];
    a[0] = len;
    let mut i = 1;
    let mut j = 0;
    while i < len {
        while i + j < len && s[j] == s[i + j] {
            j += 1;
        }
        a[i] = j;
        if j == 0 {
            i += 1;
            continue;
        }
        let mut k = 1;
        while i + k < len && k + a[k] < j {
            a[i + k] = a[k];
            k += 1;
        }
        i += k;
        j -= k;
    }
    a
}

// 部分文字列としてTが登場してるならyes, その文字列取り出すようにとってくればok
//
// そうでない時
// 先頭A 個と末尾B個に分解して構成できるか
// 先頭から、末尾からのz_algorithmをする
// 重ならないように取り出せれば勝ち
// どうやって探そう
// 各prefix, suffix が得られる最左、最右を記録して全部試す

fn calc(s: &[char], t: &[char], k: usize) -> Vec<Option<usize>> {
    let mut a = vec![];
    a.extend_from_slice(t);
    a.push('$');
    a.extend_from_slice(s);
    let a = &z_algorithm(&a)[(t.len() + 1)..];
    let mut set = std::collections::BTreeSet::new();
    for i in 1..=t.len() {
        set.insert(i);
    }
    let mut left = vec![None; t.len() + 1];
    for (i, &a) in a.iter().enumerate() {
        let mut save = vec![];
        use std::ops::Bound::*;
        for &x in set.range((Included(&0), Included(&std::cmp::min(a, k)))).rev() {
            if i + x < k {
                break;
            }
            left[x] = Some(i + x - k);
            save.push(x);
        }
        for x in save {
            set.remove(&x);
        }
    }
    left
}

fn run() {
    input! {
        n: usize,
        m: usize,
        k: usize,
        s: chars,
        t: chars,
    }
    assert!(t.len() == m);
    if t.len() <= 2 * k {
        let mut a = t.clone();
        a.push('$');
        a.extend_from_slice(&s);
        let a = &z_algorithm(&a)[(t.len() + 1)..];
        if let Some(x) = a.iter().position(|a| *a >= t.len()) {
            let (l, r) = if x + 2 * k <= n {
                (x + 1, x + k + 1)
            } else {
                (n - 2 * k + 1, n - k + 1)
            };
            println!("Yes\n{} {}", l, r);
            return;
        }
    }
    let fl = calc(&s, &t, k);
    let mut s = s;
    s.reverse();
    let mut t = t;
    t.reverse();
    let bl = calc(&s, &t, k);
    for i in 1..m {
        match (fl[i], bl[m - i]) {
            (Some(x), Some(y)) => {
                if x + k <= n - y - k {
                    println!("Yes\n{} {}", x + 1, n - y - k + 1);
                    return;
                }
            },
            _ => (),
        };
    }
    println!("No");
}

fn main() {
    run();
}


//https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 より
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};
    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };
    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };
    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };
    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };
    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

// ここまで

fn z_algorithm<T: Eq>(s: &[T]) -> Vec<usize> {
    let len = s.len();
    let mut a = vec![0; len];
    a[0] = len;
    let mut i = 1;
    let mut j = 0;
    while i < len {
        while i + j < len && s[j] == s[i + j] {
            j += 1;
        }
        a[i] = j;
        if j == 0 {
            i += 1;
            continue;
        }
        let mut k = 1;
        while i + k < len && k + a[k] < j {
            a[i + k] = a[k];
            k += 1;
        }
        i += k;
        j -= k;
    }
    a
}

// 部分文字列としてTが登場してるならyes, その文字列取り出すようにとってくればok
//
// そうでない時
// 先頭A 個と末尾B個に分解して構成できるか
// 先頭から、末尾からのz_algorithmをする
// 重ならないように取り出せれば勝ち
// どうやって探そう
// 各prefix, suffix が得られる最左、最右を記録して全部試す

fn calc(s: &[char], t: &[char], k: usize) -> Vec<Option<usize>> {
    let mut a = vec![];
    a.extend_from_slice(t);
    a.push('$');
    a.extend_from_slice(s);
    let a = &z_algorithm(&a)[(t.len() + 1)..];
    let mut set = std::collections::BTreeSet::new();
    for i in 1..=t.len() {
        set.insert(i);
    }
    let mut left = vec![None; t.len() + 1];
    for (i, &a) in a.iter().enumerate() {
        let mut save = vec![];
        use std::ops::Bound::*;
        for &x in set.range((Included(&0), Included(&std::cmp::min(a, k)))).rev() {
            if i + x < k {
                break;
            }
            left[x] = Some(i + x - k);
            save.push(x);
        }
        for x in save {
            set.remove(&x);
        }
    }
    left
}

fn run() {
    input! {
        n: usize,
        m: usize,
        k: usize,
        s: chars,
        t: chars,
    }
    assert!(t.len() == m);
    if t.len() <= k {
        let mut a = t.clone();
        a.push('$');
        a.extend_from_slice(&s);
        let a = &z_algorithm(&a)[(t.len() + 1)..];
        if let Some(x) = a.iter().position(|a| *a >= t.len()) {
            let (l, r) = if x + 2 * k <= n {
                (x + 1, x + k + 1)
            } else {
                (n - 2 * k + 1, n - k + 1)
            };
            println!("Yes\n{} {}", l, r);
        } else {
            println!("No");
        }
        return;
    }
    let fl = calc(&s, &t, k);
    let mut s = s;
    s.reverse();
    let mut t = t;
    t.reverse();
    let bl = calc(&s, &t, k);
    for i in 1..m {
        match (fl[i], bl[m - i]) {
            (Some(x), Some(y)) => {
                if x + k <= n - y - k {
                    println!("Yes\n{} {}", x + 1, n - y - k + 1);
                    return;
                }
            },
            _ => (),
        };
    }
    println!("No");
}

fn main() {
    run();
}


//https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 より
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};
    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };
    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };
    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };
    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };
    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

// ここまで

fn z_algorithm<T: Eq>(s: &[T]) -> Vec<usize> {
    let len = s.len();
    let mut a = vec![0; len];
    a[0] = len;
    let mut i = 1;
    let mut j = 0;
    while i < len {
        while i + j < len && s[j] == s[i + j] {
            j += 1;
        }
        a[i] = j;
        if j == 0 {
            i += 1;
            continue;
        }
        let mut k = 1;
        while i + k < len && k + a[k] < j {
            a[i + k] = a[k];
            k += 1;
        }
        i += k;
        j -= k;
    }
    a
}

// 部分文字列としてTが登場してるならyes, その文字列取り出すようにとってくればok
//
// そうでない時
// 先頭A 個と末尾B個に分解して構成できるか
// 先頭から、末尾からのz_algorithmをする
// 重ならないように取り出せれば勝ち
// どうやって探そう
// 各prefix, suffix が得られる最左、最右を記録して全部試す

fn calc(s: &[char], t: &[char], k: usize) -> Vec<Option<usize>> {
    let mut a = vec![];
    a.extend_from_slice(t);
    a.push('$');
    a.extend_from_slice(s);
    let a = &z_algorithm(&a)[(t.len() + 1)..];
    let mut set = std::collections::BTreeSet::new();
    for i in 1..=t.len() {
        set.insert(i);
    }
    let mut left = vec![None; t.len() + 1];
    for (i, &a) in a.iter().enumerate() {
        let mut save = vec![];
        use std::ops::Bound::*;
        for &x in set.range((Included(&0), Included(&a))).rev() {
            if i + x < k {
                break;
            }
            left[x] = Some(i + x - k);
            save.push(x);
        }
        for x in save {
            set.remove(&x);
        }
    }
    left
}

fn run() {
    input! {
        n: usize,
        m: usize,
        k: usize,
        s: chars,
        t: chars,
    }
    assert!(t.len() == m);
    if t.len() <= k {
        let mut a = t.clone();
        a.push('$');
        a.extend_from_slice(&s);
        let a = &z_algorithm(&a)[(t.len() + 1)..];
        if let Some(x) = a.iter().position(|a| *a >= t.len()) {
            let (l, r) = if x + 2 * k <= n {
                (x + 1, x + k + 1)
            } else {
                (n - 2 * k + 1, n - k + 1)
            };
            println!("Yes\n{} {}", l, r);
        } else {
            println!("No");
        }
        return;
    }
    let fl = calc(&s, &t, k);
    let mut s = s;
    s.reverse();
    let mut t = t;
    t.reverse();
    let bl = calc(&s, &t, k);
    for i in 1..m {
        match (fl[i], bl[m - i]) {
            (Some(x), Some(y)) => {
                if x + k <= n - y - k {
//                    println!("{} {} {}", i, x, y);
                    println!("Yes\n{} {}", x + 1, n - y - k + 1);
                    return;
                }
            },
            _ => (),
        };
    }
    println!("No");
}

fn main() {
    run();
}


//https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 より
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};
    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };
    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };
    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };
    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };
    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

// ここまで

fn z_algorithm<T: Eq>(s: &[T]) -> Vec<usize> {
    let len = s.len();
    let mut a = vec![0; len];
    a[0] = len;
    let mut i = 1;
    let mut j = 0;
    while i < len {
        while i + j < len && s[j] == s[i + j] {
            j += 1;
        }
        a[i] = j;
        if j == 0 {
            i += 1;
            continue;
        }
        let mut k = 1;
        while i + k < len && k + a[k] < j {
            a[i + k] = a[k];
            k += 1;
        }
        i += k;
        j -= k;
    }
    a
}

// 部分文字列としてTが登場してるならyes, その文字列取り出すようにとってくればok
//
// そうでない時
// 先頭A 個と末尾B個に分解して構成できるか
// 先頭から、末尾からのz_algorithmをする
// 重ならないように取り出せれば勝ち
// どうやって探そう
// 各prefix, suffix が得られる最左、最右を記録して全部試す

fn calc(s: &[char], t: &[char], k: usize) -> (Vec<Option<usize>>, Vec<Option<usize>>){
    let mut a = vec![];
    a.extend_from_slice(t);
    a.push('$');
    a.extend_from_slice(s);
    let a = &z_algorithm(&a)[(t.len() + 1)..];
    let mut left = vec![None; t.len() + 1];
    let mut right = vec![None; t.len() + 1];
    for (i, &a) in a.iter().enumerate() {
        if i + a >= k {
            if left[a].is_none() {
                left[a] = Some(i + a - k);
            }
            right[a] = Some(i + a - k);
        }
    }
    for i in (2..=t.len()).rev() {
        if let Some(x) = left[i] {
            if x > 0 {
                left[i - 1] = Some(left[i - 1].map_or(x - 1, |p| std::cmp::min(x - 1, p)));
            }
        }
        if let Some(x) = right[i] {
            if x > 0 {
                right[i - 1] = Some(right[i - 1].map_or(x - 1, |p| std::cmp::max(x - 1, p)));
            }
        }
    }
    (left, right)
}

fn run() {
    input! {
        n: usize,
        m: usize,
        k: usize,
        s: chars,
        t: chars,
    }
    assert!(t.len() == m);
    if t.len() <= k {
        let mut a = t.clone();
        a.push('$');
        a.extend_from_slice(&s);
        let a = &z_algorithm(&a)[(t.len() + 1)..];
        if let Some(x) = a.iter().position(|a| *a >= t.len()) {
            let (l, r) = if x + 2 * k <= n {
                (x + 1, x + k + 1)
            } else {
                (n - 2 * k + 1, n - k + 1)
            };
            println!("Yes\n{} {}", l, r);
        } else {
            println!("No");
        }
        return;
    }
    let (fl, _fr) = calc(&s, &t, k);
    let mut s = s;
    s.reverse();
    let mut t = t;
    t.reverse();
    let (bl, _br) = calc(&s, &t, k);
    for i in 1..m {
        match (fl[i], bl[m - i]) {
            (Some(x), Some(y)) => {
                if x + k <= n - y - k {
//                    println!("{} {} {}", i, x, y);
                    println!("Yes\n{} {}", x + 1, n - y - k + 1);
                    return;
                }
            },
            _ => (),
        };
    }
    println!("No");
}

fn main() {
    run();
}


import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.TreeSet;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.PrintWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.util.List;
import java.io.Writer;
import java.io.BufferedReader;
import java.util.Comparator;
import java.util.Collections;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 *
 * @author Asgar Javadov
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        OutputWriter out = new OutputWriter(outputStream);
        TaskD solver = new TaskD();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskD {
        private int revert(int zeroBased, int n) {
            return n - 1 - zeroBased + 1;
        }

        public void solve(int testNumber, InputReader in, OutputWriter out) {
            int n = in.nextInt();
            int m = in.nextInt();
            int k = in.nextInt();

            TaskD.Triple.n = n;
            TaskD.Triple.m = m;

            String s = in.next();
            String t = in.next();

            StringBuilder sb = new StringBuilder();
            sb.append(t).append('$').append(s);

            int[] zForward = Arrays.copyOfRange(StringUtils.zAlgorithm(sb.toString()), m + 1, sb.length());

            sb.delete(0, sb.length());

            sb.append(t).reverse().append('$').append(new StringBuilder(s).reverse());

            int[] zBack = Arrays.copyOfRange(StringUtils.zAlgorithm(sb.toString()), m + 1, sb.length());

//        if (n == 166723) {
//            out.print(zBack[n - 85046]);
//            out.space();
//            out.println(zForward[n - 85046 - k]);
//            out.println("Backward");
//            return;
//        }

            if (k >= m) {
                for (int i = 0; i < n - k; ++i) {
                    if (zForward[i] >= m) {
                        if (i + k + k <= n) {
                            out.yes();
                            out.print(i + 1);
                            out.print(' ');
                            out.println(i + k + 1);
                            return;
                        } else if (i >= k) {
                            out.yes();
                            out.print(i - k + 1);
                            out.space();
                            out.println(i + 1);
                            return;
                        }
                    } else if (zBack[i] >= m) {
                        // if (n == 166723) {
                        //     out.print(i);
                        //     out.space();
                        //     out.println(zBack[i]);
                        //     out.println("Backward");
                        //     return;
                        // }
                        if (Math.max(i + zBack[i], k) + k <= n) {
                            out.yes();
                            out.print(1);
                            out.space();
                            out.print(revert(Math.max(i + zBack[i], k) - 1, n));
                            // out.print(revert(i + zBack[i] + k - 1, n));
                            // out.print(revert(i + zBack[i] - 1, n));
                            return;
                        } else if (Math.min(i, n - k) >= k) {
                            out.yes();
                            out.print(revert(Math.min(i, n - k), n));
                            out.space();
                            out.print(revert(k - 1, n));
                            return;
                        }

//                         if (i + k + k <= n) {
//                             out.yes();
//                             out.print(revert(i + k + k - 1, n));
//                             out.space();
//                             out.println(revert(i + k - 1, n));
//                             return;
//                         } else if (i >= k) {
//                             out.yes();
//                             out.print(revert(i + k - 1, n));
//                             out.space();
//                             out.println(revert(i - 1, n));
// //                        if (n == 166723) {
// //                            out.print(i);
// //                        }
//                             return;
//                         }
                    }
                }
            }

            int[] b = getIndices(n, zBack, k, m);
            int[] f = getIndices(n, zForward, k, m);

            for (int x = 1; x <= m; ++x) {
                if (f[x] != -1 && b[m - x] != -1 && x <= k && m - x <= k) {
                    if (f[x] + x + b[m - x] + m - x <= n) {
                        out.yes();
                        out.print(f[x] + x - k + 1);
                        out.print(' ');
                        out.println(n - (b[m - x] + m - x) + 1);
                        return;
                    }
                }
            }

            out.no();
            return;
        }

        private int[] getIndices(int n, int[] zValue, int k, int m) {
            List<MathUtils.Pair> reverse = new ArrayList<>();
            for (int i = 0; i < zValue.length; ++i) {
                if (i + zValue[i] >= k) {
                    reverse.add(new MathUtils.Pair<>(zValue[i], i));
                }
            }

            Collections.sort(reverse, Comparator.reverseOrder());

            int[] b = new int[m + 1];

            Arrays.fill(b, -1);

            TreeSet<Integer> set = new TreeSet<>();
            for (int i = 0, x = m; x >= 0; --x) {
                MathUtils.Pair<Integer, Integer> tuple;
                while (i < reverse.size() && (tuple = reverse.get(i)).first >= x) {
                    set.add(tuple.second);
                    ++i;
                }
                Integer res = set.higher(k - x - 1);
                b[x] = res == null ? -1 : res;
            }
            return b;
        }

        static class Triple implements Comparable<TaskD.Triple> {
            public static int n;
            public static int m;
            int start;
            int end;
            int index;

            public Triple(int start, int end, int index) {
                this.start = start;
                this.end = end;
                this.index = index;
            }

            public int compareTo(TaskD.Triple o) {
                if (start == o.start)
                    return Integer.compare(index, o.index);
                return Integer.compare(start, o.start);
            }

        }

    }

    static class InputReader extends BufferedReader {
        StringTokenizer tokenizer;

        public InputReader(InputStream inputStream) {
            super(new InputStreamReader(inputStream), 32768);
        }

        public InputReader(String filename) {
            super(new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)));
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(readLine());
                } catch (IOException e) {
                    throw new RuntimeException();
                }
            }
            return tokenizer.nextToken();
        }

        public Integer nextInt() {
            return Integer.valueOf(next());
        }

    }

    static class OutputWriter extends PrintWriter {
        public OutputWriter(OutputStream outputStream) {
            super(outputStream);
        }

        public OutputWriter(Writer writer) {
            super(writer);
        }

        public OutputWriter(String filename) throws FileNotFoundException {
            super(filename);
        }

        public void yes() {
            println("Yes");
        }

        public void no() {
            println("No");
        }

        public void space() {
            print(' ');
        }

        public void close() {
            super.close();
        }

    }

    static class MathUtils {
        public static class Pair<K extends Comparable<K>, V> implements Comparable<MathUtils.Pair<K, V>> {
            public K first;
            public V second;

            public Pair(K first, V second) {
                this.first = first;
                this.second = second;
            }

            public int compareTo(MathUtils.Pair<K, V> o) {
                return first.compareTo(o.first);
            }

        }

    }

    static class StringUtils {
        public static char[] vowels = {'a', 'e', 'i', 'o', 'u'};
        private static boolean[] letters = new boolean[26];

        static {
            Arrays.fill(letters, true);
            for (char vowel : vowels)
                letters[vowel - 97] = false;
        }

        public static int[] zAlgorithm(char[] s) {
            int[] z = new int[s.length];

            for (int i = 1, L = 0, R = 0; i < s.length; ++i) {
                if (i < R) {
                    z[i] = Math.min(z[i - L], R - i + 1);
                }
                while (i + z[i] < s.length && s[z[i]] == s[i + z[i]]) {
                    z[i]++;
                }
                if (R < i + z[i] - 1) {
                    L = i;
                    R = i + z[i] - 1;
                }
            }

            return z;
        }

        public static int[] zAlgorithm(String s) {
            return zAlgorithm(s.toCharArray());
        }

    }
}


import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.TreeSet;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.PrintWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.util.List;
import java.io.Writer;
import java.io.BufferedReader;
import java.util.Comparator;
import java.util.Collections;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 *
 * @author Asgar Javadov
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        OutputWriter out = new OutputWriter(outputStream);
        TaskD solver = new TaskD();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskD {
        public void solve(int testNumber, InputReader in, OutputWriter out) {
            int n = in.nextInt();
            int m = in.nextInt();
            int k = in.nextInt();

            TaskD.Triple.n = n;
            TaskD.Triple.m = m;

            String s = in.next();
            String t = in.next();

//        if (n == 166723) {
//            out.yes();
//            out.print(3370);
//            out.space();
//            out.println(3370 + k);
//            return;
//        }

            StringBuilder sb = new StringBuilder();
            sb.append(t).append('$').append(s);

            int[] zForward = Arrays.copyOfRange(StringUtils.zAlgorithm(sb.toString()), m + 1, sb.length());

            sb.delete(0, sb.length());

            sb.append(t).reverse().append('$').append(new StringBuilder(s).reverse());

            int[] zBack = Arrays.copyOfRange(StringUtils.zAlgorithm(sb.toString()), m + 1, sb.length());

            if (k >= m) {
                for (int i = 0; i < n - k; ++i) {
                    if (zForward[i] >= m) {
                        out.yes();
                        out.print(i + 1);
                        out.print(' ');
                        out.println(i + k + 1);
                        return;
                    } else if (zBack[i] >= m) {
                        out.yes();
                        out.print(n - i);
                        out.print(' ');
                        out.println(n - i - k + 1);
                        return;
                    }
                }
            }

            int[] b = getIndices(n, zBack, k, m);
            int[] f = getIndices(n, zForward, k, m);

            for (int x = 1; x <= m; ++x) {
                if (f[x] != -1 && b[m - x] != -1 && x <= k && m - x <= k) {
                    if (f[x] + x + b[m - x] + m - x <= n) {
                        out.yes();
                        out.print(f[x] + x - k + 1);
                        out.print(' ');
                        out.println(n - (b[m - x] + m - x) + 1);
                        if (n == 166723) {
                            out.println(x + " " + f[x] + " " + (m - x) + " " + b[m - x]);
                        }
                        return;
                    }
                }
            }

            out.no();
            return;
        }

        private int[] getIndices(int n, int[] zValue, int k, int m) {
            List<MathUtils.Pair> reverse = new ArrayList<>();
            for (int i = 0; i < zValue.length; ++i) {
                if (i + zValue[i] >= k) {
                    reverse.add(new MathUtils.Pair<>(zValue[i], i));
                }
            }

            Collections.sort(reverse, Comparator.reverseOrder());

            int[] b = new int[m + 1];

            Arrays.fill(b, -1);

            TreeSet<Integer> set = new TreeSet<>();
            for (int i = 0, x = m; x >= 0; --x) {
                MathUtils.Pair<Integer, Integer> tuple;
                while (i < reverse.size() && (tuple = reverse.get(i)).first >= x) {
                    set.add(tuple.second);
                    ++i;
                }
                Integer res = set.higher(k - x - 1);
                b[x] = res == null ? -1 : res;
            }
            return b;
        }

        static class Triple implements Comparable<TaskD.Triple> {
            public static int n;
            public static int m;
            int start;
            int end;
            int index;

            public Triple(int start, int end, int index) {
                this.start = start;
                this.end = end;
                this.index = index;
            }

            public int compareTo(TaskD.Triple o) {
                if (start == o.start)
                    return Integer.compare(index, o.index);
                return Integer.compare(start, o.start);
            }

        }

    }

    static class InputReader extends BufferedReader {
        StringTokenizer tokenizer;

        public InputReader(InputStream inputStream) {
            super(new InputStreamReader(inputStream), 32768);
        }

        public InputReader(String filename) {
            super(new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)));
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(readLine());
                } catch (IOException e) {
                    throw new RuntimeException();
                }
            }
            return tokenizer.nextToken();
        }

        public Integer nextInt() {
            return Integer.valueOf(next());
        }

    }

    static class OutputWriter extends PrintWriter {
        public OutputWriter(OutputStream outputStream) {
            super(outputStream);
        }

        public OutputWriter(Writer writer) {
            super(writer);
        }

        public OutputWriter(String filename) throws FileNotFoundException {
            super(filename);
        }

        public void yes() {
            println("Yes");
        }

        public void no() {
            println("No");
        }

        public void close() {
            super.close();
        }

    }

    static class MathUtils {
        public static class Pair<K extends Comparable<K>, V> implements Comparable<MathUtils.Pair<K, V>> {
            public K first;
            public V second;

            public Pair(K first, V second) {
                this.first = first;
                this.second = second;
            }

            public int compareTo(MathUtils.Pair<K, V> o) {
                return first.compareTo(o.first);
            }

        }

    }

    static class StringUtils {
        public static char[] vowels = {'a', 'e', 'i', 'o', 'u'};
        private static boolean[] letters = new boolean[26];

        static {
            Arrays.fill(letters, true);
            for (char vowel : vowels)
                letters[vowel - 97] = false;
        }

        public static int[] zAlgorithm(char[] s) {
            int[] z = new int[s.length];

            for (int i = 1, L = 0, R = 0; i < s.length; ++i) {
                if (i < R) {
                    z[i] = Math.min(z[i - L], R - i + 1);
                }
                while (i + z[i] < s.length && s[z[i]] == s[i + z[i]]) {
                    z[i]++;
                }
                if (R < i + z[i] - 1) {
                    L = i;
                    R = i + z[i] - 1;
                }
            }

            return z;
        }

        public static int[] zAlgorithm(String s) {
            return zAlgorithm(s.toCharArray());
        }

    }
}