#include <bits/stdc++.h>
using namespace std;
int S[2][500005 * 4], pre[500005], suf[500005];
long long hpr1[3][500005], hpr2[3][500005], hsf1[3][500005], hsf2[3][500005],
    pww[3][500005];
int n, m, k;
long long pr[3] = {79, 103, 211};
bool flag;
char a[500005], b[500005];
vector<int> sss[500005], ppp[500005];
int get(int node, int bas, int son, int x, int y, int w) {
  if (bas > y || son < x) return (w ? -1 : 1900000000);
  if (bas >= x && son <= y) {
    if (bas == son) {
      if (S[w][node]) {
        flag = true;
        return bas;
      }
      return 1900000000;
    }
    if (w) {
      if (S[w][node * 2 + 1])
        return get(node * 2 + 1, ((bas + son) / 2) + 1, son, x, y, w);
      else if (S[w][node * 2])
        return get(node * 2, bas, ((bas + son) / 2), x, y, w);
      else
        return -1;
    } else {
      if (S[w][node * 2])
        return get(node * 2, bas, ((bas + son) / 2), x, y, w);
      else if (S[w][node * 2 + 1])
        return get(node * 2 + 1, ((bas + son) / 2) + 1, son, x, y, w);
      else
        return 1900000000;
    }
  }
  if (w) {
    int res = get(node * 2 + 1, ((bas + son) / 2) + 1, son, x, y, w);
    if (flag) return res;
    return get(node * 2, bas, ((bas + son) / 2), x, y, w);
  } else {
    int res = get(node * 2, bas, ((bas + son) / 2), x, y, w);
    if (flag) return res;
    return get(node * 2 + 1, ((bas + son) / 2) + 1, son, x, y, w);
  }
}
void up(int node, int bas, int son, int x, int val, int w) {
  if (bas > x || son < x) return;
  if (bas == x && son == x) {
    S[w][node] = val;
    return;
  }
  up(node * 2, bas, ((bas + son) / 2), x, val, w);
  up(node * 2 + 1, ((bas + son) / 2) + 1, son, x, val, w);
  S[w][node] = S[w][node * 2] + S[w][node * 2 + 1];
}
void build(int node, int bas, int son, int w) {
  if (bas == son) {
    S[w][node] = 1;
    return;
  }
  build(node * 2, bas, ((bas + son) / 2), w);
  build(node * 2 + 1, ((bas + son) / 2) + 1, son, w);
  S[w][node] = S[w][node * 2] + S[w][node * 2 + 1];
}
pair<pair<long long, long long>, long long> suf2(int bas, int son) {
  return {{hsf2[0][son] - hsf2[0][bas + 1] * pww[0][bas - son + 1],
           hsf2[1][son] - hsf2[1][bas + 1] * pww[1][bas - son + 1]},
          hsf2[2][son] - hsf2[2][bas + 1] * pww[2][bas - son + 1]};
}
pair<pair<long long, long long>, long long> suf1(int bas, int son) {
  return {{hsf1[0][son] - hsf1[0][bas + 1] * pww[0][bas - son + 1],
           hsf1[1][son] - hsf1[1][bas + 1] * pww[1][bas - son + 1]},
          hsf1[2][son] - hsf1[2][bas + 1] * pww[2][bas - son + 1]};
}
pair<pair<long long, long long>, long long> pre2(int bas, int son) {
  return {{hpr2[0][son] - hpr2[0][bas - 1] * pww[0][son - bas + 1],
           hpr2[1][son] - hpr2[1][bas - 1] * pww[1][son - bas + 1]},
          hpr2[2][son] - hpr2[2][bas - 1] * pww[2][son - bas + 1]};
}
pair<pair<long long, long long>, long long> pre1(int bas, int son) {
  return {{hpr1[0][son] - hpr1[0][bas - 1] * pww[0][son - bas + 1],
           hpr1[1][son] - hpr1[1][bas - 1] * pww[1][son - bas + 1]},
          hpr1[2][son] - hpr1[2][bas - 1] * pww[2][son - bas + 1]};
}
void hashsuf() {
  for (int i = n; i >= 1; i--) {
    for (int j = 0; j < 3; j++) {
      hsf1[j][i] = hsf1[j][i + 1] * pr[j] + a[i] - 'a' + 1;
    }
  }
  for (int i = m; i >= 1; i--) {
    for (int j = 0; j < 3; j++) {
      hsf2[j][i] = hsf2[j][i + 1] * pr[j] + b[i] - 'a' + 1;
    }
  }
}
void hashpre() {
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < 3; j++) {
      hpr1[j][i] = hpr1[j][i - 1] * pr[j] + a[i] - 'a' + 1;
    }
  }
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j < 3; j++) {
      hpr2[j][i] = hpr2[j][i - 1] * pr[j] + b[i] - 'a' + 1;
    }
  }
}
pair<int, int> getsuf(int from, int len) {
  flag = false;
  int pos = get(1, 1, n, from + len - 1, n - (k - len), 1);
  int be = pos - len + 1;
  int en = pos + (k - len);
  if (be < from || en > n) return {1900000000, 1900000000};
  return {be, en};
}
int main() {
  scanf("%d %d %d", &n, &m, &k);
  scanf("%s", a + 1);
  scanf("%s", b + 1);
  hashpre();
  hashsuf();
  pww[0][0] = pww[1][0] = pww[2][0] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 0; j < 3; j++) pww[j][i] = pww[j][i - 1] * pr[j];
  for (int i = 1; i <= n; i++) {
    int bas = 1, son = min(m, n - i + 1);
    while (bas <= son) {
      if (pre1(i, i + ((bas + son) / 2) - 1) == pre2(1, ((bas + son) / 2)))
        bas = ((bas + son) / 2) + 1;
      else
        son = ((bas + son) / 2) - 1;
    }
    pre[i] = son;
    ppp[son].push_back(i);
    bas = 1, son = min(m, i);
    while (bas <= son) {
      if (suf1(i, i - ((bas + son) / 2) + 1) ==
          suf2(m, m - ((bas + son) / 2) + 1))
        bas = ((bas + son) / 2) + 1;
      else
        son = ((bas + son) / 2) - 1;
    }
    suf[i] = son;
    sss[son].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    if (pre[i] == m && m <= k) {
      int mxen = min(n, i + k - 1);
      int mnbe = max(1, i - k + 1);
      if (mxen - 2 * k + 1 >= 1) {
        printf("Yes\n%d %d", mxen - 2 * k + 1, mxen - k + 1);
        return 0;
      }
      if (mnbe + 2 * k - 1 <= n) {
        printf("Yes\n%d %d", mnbe, mnbe + k);
        return 0;
      }
    }
  }
  build(1, 1, n, 0);
  for (int i = 0; i <= min(k, m); i++) {
    for (int j = 0; j < (int)sss[m - i].size(); j++)
      up(1, 1, n, sss[m - i][j], 1, 1);
    flag = false;
    int pos = get(1, 1, n, k - i + 1, n, 0);
    for (int j = 0; j < (int)ppp[i].size(); j++) up(1, 1, n, ppp[i][j], 0, 0);
    if (m - i > k) continue;
    int en = pos + i - 1;
    int be = en - k + 1;
    if (en > n || be < 1) continue;
    pair<int, int> res = getsuf(en + 1, m - i);
    if (res.first < en + 1 || res.second > n) continue;
    printf("Yes\n%d %d", be, res.first);
    return 0;
  }
  printf("No");
}
