#include <bits/stdc++.h>
using namespace std;
int n, m, k, num = 0, fst[500010], en = 0;
char s[500010], t[500010];
int a[500010], b[500010];
int pos[500010];
struct edge {
  int x, y, n;
} e[500010];
struct pnt {
  int f, s, tp, sz, en;
} p[500010];
struct tree {
  int l, r, c;
  tree *lc, *rc;
  tree(int l, int r) : l(l), r(r), c(0), lc(NULL), rc(NULL) {}
} * root;
tree *bt(int l, int r) {
  tree *i = new tree(l, r);
  if (l < r) {
    int md = l + r >> 1;
    i->lc = bt(l, md);
    i->rc = bt(md + 1, r);
  }
  return i;
}
void chg(tree *i, int l, int r, int c) {
  if (i->l == l && i->r == r) {
    i->c = c;
    return;
  }
  int md = i->l + i->r >> 1;
  if (r <= md)
    chg(i->lc, l, r, c);
  else if (l > md)
    chg(i->rc, l, r, c);
  else
    chg(i->lc, l, md, c), chg(i->rc, md + 1, r, c);
}
void pushdown(tree *i) {
  if (i->c) i->lc->c = i->rc->c = i->c, i->c = 0;
}
int get(tree *i, int x) {
  if (i->l == i->r) return i->c;
  pushdown(i);
  int md = i->l + i->r >> 1;
  if (x <= md)
    return get(i->lc, x);
  else
    return get(i->rc, x);
}
void ins(int x, int y) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].n = fst[x];
  fst[x] = num;
}
void dfs1(int x) {
  p[x].sz = 1;
  for (int i = fst[x]; i; i = e[i].n) {
    int y = e[i].y;
    p[y].f = x;
    dfs1(y);
    if (p[x].s == 0 || p[y].sz > p[p[x].s].sz) p[x].s = y;
    p[x].sz += p[y].sz;
  }
}
void dfs2(int x, int tp) {
  p[x].en = ++en;
  p[x].tp = tp;
  if (p[x].s) {
    dfs2(p[x].s, tp);
    for (int i = fst[x]; i; i = e[i].n) {
      int y = e[i].y;
      if (y != p[x].s) dfs2(y, y);
    }
  }
}
void kmp(int *a, bool tf = 0) {
  static int f[500010];
  f[0] = f[1] = 0;
  for (int i = 2; i <= m; i++) {
    int j = f[i - 1];
    while (j && t[j + 1] != t[i]) j = f[j];
    if (t[j + 1] == t[i]) j++;
    f[i] = j;
  }
  for (int i = 1, j = 0; i <= n; i++) {
    while (j && t[j + 1] != s[i]) j = f[j];
    if (t[j + 1] == s[i]) j++;
    a[i] = j;
  }
  if (tf)
    for (int i = 1; i <= m; i++) ins(f[i], i);
}
void chg(int x, int c) {
  while (~x) {
    chg(root, p[p[x].tp].en, p[x].en, c);
    x = p[p[x].tp].f;
  }
}
int main() {
  scanf("%d%d%d%s%s", &n, &m, &k, s + 1, t + 1);
  kmp(a, 1);
  for (int i = 1; i <= n; i++)
    if (a[i] == m) {
      if (i <= k + k)
        printf("Yes\n%d %d\n", 1, k + 1);
      else if (i > n - k)
        printf("Yes\n%d %d\n", n - k - k + 1, n - k + 1);
      else
        printf("Yes\n%d %d\n", i - k - k + 1, i - k + 1);
      return 0;
    }
  p[0].f = -1;
  dfs1(0);
  dfs2(0, 0);
  root = bt(1, en);
  reverse(s + 1, s + 1 + n);
  reverse(t + 1, t + 1 + m);
  kmp(b);
  reverse(b + 1, b + 1 + n);
  for (int i = k; i <= n - k; i++) {
    chg(a[i], i);
    int hh;
    if (b[i + 1] <= k && m - b[i + 1] <= k &&
        (hh = get(root, p[m - b[i + 1]].en))) {
      printf("Yes\n%d %d\n", hh - k + 1, i + 1);
      return 0;
    }
  }
  puts("No");
}
