#include <bits/stdc++.h>
using namespace std;
int n, m, K, bs[500005], hs[500005], ht[500005], ht2[500005], lpos[500005],
    rpos[500005], ansl, ansr;
bool flag;
set<int> S;
set<int>::iterator it;
struct node {
  int len, id;
} a[500005];
char s[500005], t[500005];
int Hashs(int fr, int to) {
  return (-(long long)hs[fr - 1] * bs[to - fr + 1] % 1000000007 + hs[to] +
          1000000007) %
         1000000007;
}
bool check(int fr, int l) { return ht[l] == Hashs(fr, fr + l - 1); }
bool check2(int to, int l) { return ht2[m - l + 1] == Hashs(to - l + 1, to); }
bool cmp1(const node &lhs, const node &rhs) { return lhs.len > rhs.len; }
int main() {
  scanf("%d%d%d", &n, &m, &K);
  scanf("%s", s + 1);
  scanf("%s", t + 1);
  bs[0] = 1;
  for (int i = 1; i <= n; ++i) bs[i] = (long long)bs[i - 1] * 8741 % 1000000007;
  for (int i = 1; i <= n; ++i)
    hs[i] = ((long long)hs[i - 1] * 8741 + s[i]) % 1000000007;
  for (int i = 1; i <= m; ++i)
    ht[i] = ((long long)ht[i - 1] * 8741 + t[i]) % 1000000007;
  for (int i = 1; i <= n; ++i) {
    int l = 0, r = min(m, n - i + 1), mid;
    while (l < r) {
      mid = (l + r + 1) >> 1;
      if (check(i, mid))
        l = mid;
      else
        r = mid - 1;
    }
    a[i] = (node){l, i};
  }
  sort(a + 1, a + n + 1, cmp1);
  S.clear();
  int now = 1;
  for (int i = m; i >= 1; --i) {
    for (; a[now].len == i && now <= n; now++) {
      S.insert(a[now].id);
    }
    if (i == m) {
      it = S.lower_bound(1);
      if (it != S.end())
        lpos[i] = *it;
      else
        lpos[i] = 1000000000;
    } else {
      it = S.lower_bound(K - i + 1);
      if (it != S.end())
        lpos[i] = *it;
      else
        lpos[i] = 1000000000;
    }
  }
  for (int i = m; i >= 1; --i) {
    ht2[i] = (-(long long)ht[i - 1] * bs[m - i + 1] % 1000000007 + ht[m] +
              1000000007) %
             1000000007;
  }
  S.clear();
  for (int i = 1; i <= n; ++i) {
    int l = 0, r = i, mid;
    while (l < r) {
      mid = (l + r + 1) >> 1;
      if (check2(i, mid))
        l = mid;
      else
        r = mid - 1;
    }
    a[i] = (node){l, i};
  }
  sort(a + 1, a + n + 1, cmp1);
  now = 1;
  for (int i = m; i >= 1; --i) {
    for (; a[now].len == i && now <= n; now++) {
      S.insert(a[now].id);
    }
    if (i == m) {
      it = S.lower_bound(K);
      if (it != S.end())
        rpos[i] = *it;
      else
        rpos[i] = -1000000000;
    } else {
      it = S.upper_bound(n + i - K);
      if (it != S.begin()) {
        it--;
        rpos[i] = *it;
      } else
        rpos[i] = -1000000000;
    }
  }
  flag = 0;
  for (int i = 1; i < m; ++i) {
    int x = lpos[i], y = rpos[m - i];
    if (i > K || m - i > K) continue;
    if (x + i - 1 <= y - m + i) {
      flag = 1;
      ansl = x + i - K, ansr = y - m + i + 1;
      break;
    }
  }
  if (!flag && m <= K) {
    if (max(K, lpos[m] + m - 1) + K <= n) {
      flag = 1;
      ansl = max(lpos[m] + m - 1, K) - K + 1, ansr = n - K + 1;
    }
    if (min(n - K + 1, rpos[m] - m + 1) - K >= 1) {
      flag = 1;
      ansl = 1, ansr = min(n - K + 1, rpos[m] - m + 1);
    }
  }
  if (flag)
    printf("Yes\n%d %d\n", ansl, ansr);
  else
    printf("No\n");
  return 0;
}
