#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void checkmin(T &a, const T &b) {
  if (b < a) a = b;
}
template <class T>
inline void checkmax(T &a, const T &b) {
  if (b > a) a = b;
}
const int inf = 1e9 + 10;
const int maxn = 5e5 + 10;
string s, t;
int n, m, k;
vector<int> que[maxn], spz;
int p[maxn][2], tree[maxn * 4];
void init() {
  for (int i = 0; i < maxn * 4; i++) tree[i] = inf;
}
void update(int x, int l, int r, int pos, int v) {
  if (l == r) {
    tree[x] = v;
    return;
  }
  int mid = (l + r) >> 1;
  if (mid >= pos)
    update(x << 1, l, mid, pos, v);
  else
    update(x << 1 | 1, mid + 1, r, pos, v);
  tree[x] = min(tree[x << 1], tree[x << 1 | 1]);
}
vector<int> build_zfunction(string a) {
  vector<int> z(a.size(), 0);
  z[0] = (int)a.size();
  int j = 1;
  for (int i = 1; i < (int)a.size(); i++) {
    int u = max(0, min(j + z[j] - i, z[i - j]));
    while (a[u] == a[i + u]) u++;
    z[i] = u;
    if (i + z[i] >= j + z[j]) j = i;
  }
  return z;
}
void special() {
  for (int i = m + 1; i < m + n + 1; i++) {
    if (spz[i] == m && k >= m) {
      int pos1 = i - m - 1;
      if (pos1 + k - 1 >= n) {
        int ed = n - 1, pos1 = ed - k + 1;
        cout << "Yes\n"
             << "1"
             << " " << pos1 + 1 << "\n";
        exit(0);
      }
      if (k - 1 >= pos1 && pos1 + k + k - 1 >= n) continue;
      cout << "Yes\n";
      if (k - 1 < pos1)
        cout << 1 << " " << pos1 + 1 << "\n";
      else if (pos1 + k + k - 1 < n)
        cout << pos1 + 1 << " " << pos1 + k + 1 << "\n";
      exit(0);
    }
  }
}
void getv(string str, int t) {
  vector<int> z = build_zfunction(str);
  if (t == 0) spz = z;
  for (int i = 0; i < maxn; i++) que[i].clear();
  init();
  for (int i = m + 1; i < m + n + 1; i++) que[z[i]].push_back(i - m - 1);
  for (int i = 0; i < maxn; i++) p[i][t] = inf;
  for (int i = m; i >= k + 1; i--)
    for (int j = 0; j < que[i].size(); j++)
      update(1, 0, n - 1, que[i][j], que[i][j]);
  for (int i = k; i >= 0; i--) {
    int pos = k - i;
    for (int j = 0; j < que[i].size(); j++) {
      if (que[i][j] < pos) continue;
      update(1, 0, n - 1, que[i][j], que[i][j]);
    }
    if (i != k) update(1, 0, n - 1, pos - 1, inf);
    if (t == 0)
      p[i][t] = tree[1];
    else {
      if (tree[1] == inf)
        p[i][t] = inf;
      else
        p[i][t] = n - 1 - tree[1];
    }
  }
}
int main() {
  cin >> n >> m >> k >> s >> t;
  getv(t + '#' + s, 0);
  reverse(t.begin(), t.end());
  reverse(s.begin(), s.end());
  getv(t + '#' + s, 1);
  reverse(t.begin(), t.end());
  reverse(s.begin(), s.end());
  p[0][0] = k;
  p[0][1] = n - 1 - k;
  special();
  for (int i = 0; i <= k; i++) {
    int need = m - i;
    if (p[i][0] == inf || p[need][1] == inf) continue;
    int pos1 = p[i][0] + i - 1, pos2 = p[need][1] - need + 1;
    if (pos1 >= pos2) continue;
    cout << "Yes\n" << pos1 - k + 1 + 1 << " " << pos2 + 1 << "\n";
    return 0;
  }
  cout << "No\n";
  return 0;
}
